【发布时间】:2017-11-20 12:38:31
【问题描述】:
我正忙于试验 SQS。据我了解,可见性超时会使其他消费者在可见性超时期间无法使用消息。不过,根据我的经验,情况似乎并非如此。可见性超时似乎使该队列中的 all 消息不可用。
我有确认这一点的代码:
SendMessageRequest messageRequest = new SendMessageRequest()
.withMessageBody("first one")
.withMessageDeduplicationId(UUID.randomUUID().toString())
.withQueueUrl(queueAddress)
.withMessageGroupId("test1");
sqs.sendMessage(messageRequest);
messageRequest = new SendMessageRequest()
.withMessageBody("second one")
.withMessageDeduplicationId(UUID.randomUUID().toString())
.withQueueUrl(queueAddress)
.withMessageGroupId("test1");
sqs.sendMessage(messageRequest);
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueAddress);
new Thread(() -> {
System.out.println("t1");
List<Message> messages = sqs.receiveMessage(receiveMessageRequest
.withMaxNumberOfMessages(1)
.withMessageAttributeNames("All")
.withVisibilityTimeout(5)
.withWaitTimeSeconds(1)
).getMessages();
System.out.println(messages.get(0).getBody());
}).start();
new Thread(() -> {
System.out.println("t2");
List<Message> messages = sqs.receiveMessage(receiveMessageRequest
.withMaxNumberOfMessages(1)
.withMessageAttributeNames("All")
.withVisibilityTimeout(5)
.withWaitTimeSeconds(1)
).getMessages();
System.out.println(messages.get(0).getBody());
}).start();
发生的情况是第二个线程抛出了 IndexOutOfBoundsException。这是因为它没有可用的消息。这确认可见性超时影响整个队列,而不仅仅是消息。
不幸的是,这似乎不符合亚马逊的文档。
如果有人知道为什么会这样,或者我在滥用 SQS SDK,请告诉我 :)
【问题讨论】:
-
我不介意投反对票 - 但您愿意解释一下原因吗?
标签: java aws-sdk amazon-sqs aws-java-sdk