【问题标题】:Is it mandatory to implement AWS SQS with JMS in Java?是否必须在 Java 中使用 JMS 实施 AWS SQS?
【发布时间】:2018-09-04 09:38:57
【问题描述】:

我是 AWS SQS 的新手,我想在我的项目中实施它。我的问题是我可以独立实现 SQS 还是需要使用 SQS Java 消息库?你能帮我解决这个问题吗?提前致谢 。

【问题讨论】:

    标签: jakarta-ee jms amazon-sqs long-polling


    【解决方案1】:

    绝对不需要 - 根本不需要 JMS。事实上,我建议不要这样做,因为它是 JMS 1.0 并且没有利用任何 JMS 2 代码。

    您可以从创建队列这样简单的事情开始:

    CreateQueueRequest createQueueRequest = new CreateQueueRequest("my-queue-name");
    String queueUrl = amazonSQS.createQueue(createQueueRequest).getQueueUrl();
    

    然后可以将消息放入该队列并从中读取。

    最大的不同是 SQS 需要轮询。它不像MessageListener 中的onMessage 方法那样由事件驱动。您一次最多可以轮询和接收 10 条消息。这看起来像:

    ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl)
                      .withMaxNumberOfMessages(10)
                      .withWaitTimeSeconds(5);
    
    List<Message> messages = amazonSQS.receiveMessage(receiveMessageRequest).getMessages();
    
    for (Message message : messages) {
        // process each message
    }
    

    话虽如此,您可以让一个线程进行读取,如果有消息,如果您愿意,可以自己将其发送到 JMS 队列。这就是 Amazon JMS/SQS 库最终要做的事情。

    查看Java SQS examples 了解更多详情。

    编辑

    为了解决评论中发布的问题,处理 SQS 队列的一种方法是轮询线程中的特定 SQS 队列。虽然您可以轮询多个 SQS 队列,但在代码中轮询一个要简单一些。只要您的程序正在运行,您就会轮询 SQS 队列。如果停止轮询,您将不再收到任何 SQS 消息。

    【讨论】:

    • 感谢@stdunbar 的回答和澄清,JMS 是事件驱动的,SQS 是轮询驱动的。轮询是否像 onMessage() 一样连续指向队列?或者我们需要像 getMessages() 那样在无限循环中处理它(while(true))?你能澄清一下吗?提前致谢。
    • @AmirsohalShaikh - 我相信我已经澄清了添加您要求的信息的答案 - 如果仍然不清楚,请告诉我。
    • 感谢@stdunbar 的回复。是的,我得到了我的问题的答案。我一直在寻找 AWS SQS 是否提供了任何 Active Listener(如在 JMS MessageListener 中),或者我们需要以编程方式处理它。现在我很清楚我们需要使用轮询来自己创建 SQS 侦听器。我们可以使用自己的逻辑来创建 Active Listener,如多线程或调度程序等。
    猜你喜欢
    • 2021-10-05
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多