我有一个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个前消息,但它不会连续返回添加到队列的新消息。它基本上只检索前几条消息一次。
1条答案
按热度按时间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秒调用一次队列。
请参阅:设置长轮询