我创建了一个基本的非FIFO队列,并且只在其上放置了一条消息。我使用以下代码检索消息:
ReceiveMessageRequest request = new ReceiveMessageRequest();
request.setQueueUrl(queueUrl);
request.setMaxNumberOfMessages(10);
request.withMessageAttributeNames("All");
ReceiveMessageResult result = sqsClient.receiveMessage(request);
List<Message> messages = result.getMessages();
messages.size()给出3
他们有:
将MaxNumberOfMessages
从10更改为1会修复它,但我希望将来可以批量接收10个。
有人可以解释为什么它会检索更多的消息吗?
以下是我的队列配置:
Default visibility timeout = 0
message retention = 4 days
max message size = 256kb
delivery delay = 0
receive message wait time = 0
no redrive policy
答案 0 :(得分:2)
@Michael的详细信息/补充 - sqlbot评论。
将SQS visibility timeout设置为较小的值不会解决您的问题。你将再次遇到这个问题。使用30秒或更长时间以允许程序使用该消息。 (为了应对程序崩溃/意外程序延迟,您应该创建重新驱动策略以缓解问题。)
中提及此问题Amazon SQS会在多台服务器上存储您的邮件副本 冗余和高可用性。在极少数情况下,其中之一 存储邮件副本的服务器可能在您使用时不可用 接收或删除信息。
如果发生这种情况,则不会删除该邮件的副本 不可用的服务器,您可能会再次获得该邮件副本 接收消息。您应该将应用程序设计为幂等的 (处理时不应对它们产生不利影响 消息不止一次)。
答案 1 :(得分:0)
将Default Visibility Timeout
从0更改为1秒修复了问题