Spring Boot 长轮询/保持检索新SQS消息的最佳方法

fcg9iug3  于 2023-06-22  发布在  Spring
关注(0)|答案(1)|浏览(153)

我有一个Java Sping Boot 应用程序,我想在SQS消息传入时监听它们。理想情况下,我希望以最有效的方式做到这一点。目前我能看到的唯一解决方案是每隔几秒运行一次while循环并轮询SQS队列,但我觉得还有更好的解决方案。最好使用AWS Java SDK v2
我尝试使用@SqsListener,但似乎不起作用。

@SqsListener(SQS_SMS_QUEUE_URL)
    public static void loadMessageFromSQS(String message) {
        log.info("message from SQS Queue {}", message);
    }
  • 从上面的示例中没有返回任何内容。
while(true){
   ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
                    .queueUrl(WORKY_SQS_SMS_QUEUE_URL)
                    .maxNumberOfMessages(7)
                    .build();

            final List<Message> messages =  sqsClient.receiveMessage(receiveMessageRequest).messages();
            log.info("num of messages: {}", messages.size());
            messages.forEach(message -> log.info("the conents: {} ", message.toString()));

}
  • 如果没有While循环,这是工作的,但只返回2个前消息,但它不会连续返回添加到队列的新消息。它基本上只检索前几条消息一次。
bpzcxfmw

bpzcxfmw1#

Amazon SQS short and long polling - Amazon Simple Queue Service
使用短轮询时,ReceiveMessage请求仅查询服务器的一个子集(基于加权随机分布),以查找可包含在响应中的消息。Amazon SQS会立即发送响应,即使查询没有找到任何消息。
使用长轮询时,ReceiveMessage请求查询所有服务器的消息。Amazon SQS在收集到至少一条可用消息后发送响应,最多不超过请求中指定的最大消息数。Amazon SQS仅在轮询等待时间到期时发送空响应。
...当您使用短轮询从队列中消费消息时,Amazon SQS会对其服务器的一个子集进行采样(基于加权随机分布),并仅返回来自这些服务器的消息。因此,特定的ReceiveMessage请求可能不会返回所有消息
因此,您可以使用长轮询来接收更多消息。
ReceiveMessageRequest (AWS SDK for Java)
waitTimeSeconds():调用在返回之前等待消息到达队列的持续时间(以秒为单位)。
当传递waitTimeSeconds的值(最长20秒)时,当队列中没有可用消息时,调用将阻塞。但是,如果有消息(或在该时间段内收到消息),它将立即返回消息。
这意味着,如果没有可用消息,则您的应用将仅每20秒调用一次队列。
请参阅:设置长轮询

相关问题