我对SQS Source Queue及其DLQ如何处理消息处理存有疑问。
我知道SQS没有像JMS那样实现trasaction,而是使用带超时的锁,因此在超时到期后,其他订阅者可以从队列中获取。
说过如何实现下面的行为(使用更多的SQS配置而不是客户端实现)?
答案 0 :(得分:1)
这基本上是为您构建的SQS。通常,您的配置是将死信队列作为主队列的重新驱动目标。指定3作为"最大接收"对于重新启动政策。然后,您的主要代码将类似于:
while( true ) {
ReceiveMessageRequest receiveMessageRequest =
new ReceiveMessageRequest(eventQueueUrl)
.withMaxNumberOfMessages(10)
.withWaitTimeSeconds(5);
List<Message> messages = amazonSQS.receiveMessage(receiveMessageRequest)
.getMessages();
for (Message nextMessage: messages) {
// handle the message. if the handling fails just continue.
// if the message was processed correctly, delete it
amazonSQS.deleteMessage(queueURL,nextMessage.getReceiptHandle() );
}
}
这里的关键是,如果你不从主队列中删除该消息,它将在默认情况下再次可用,30秒。这可以作为主要队列&#34;默认可见性超时&#34;的一部分进行更改。如果你删除它,它将永远不会再被看到。在您的失败情况下,您将处理该消息3次,并且在失败多次之后,它将自动移动到死信队列。
关于死信队列的轻微警告 - 在您尝试读取第四时间之前,该消息不会移动到死信队列。你的代码永远不会看到它,但如果你尝试3次并期望它在第三次阅读后最终进入DLQ,你就不会看到它。当您第4次尝试阅读时,AWS意识到它无法将其提供给您并为您移动。
除此之外 - 我认为Java是你提到JMS的。