我正在将 Amazon SQS 与带有Java EE 7的 Amazon SQS-JMS java库一起使用。我想要实现的是在收到消息后,取决于业务逻辑应用程序确认(使用)消息或再次将其重新发送到队列,并在3次重试失败后将其移至DLQ。
我在JMS中使用 CLIENT_Acknowledge 模式并且仅确认已成功处理的消息,但这来自他们的官方文档:
在此模式下,当确认消息时,也会隐式确认在此消息之前收到的所有消息。例如,如果收到10条消息,并且只确认了第10条消息(按照接收消息的顺序),那么之前的所有9条消息也会被确认。
对我来说,这是一种奇怪的行为,与我对client_acknowledge的期望相反。这里有一个更优雅的解决方案,而不仅仅是根据流程状态在整个代码中手动发送消息到主SQS队列或DLQ吗?
答案 0 :(得分:2)
您可以使用:
UNORDERED_ACKNOWLEDGE
SQSSession.UNORDERED_ACKNOWLEDGE
来自“ com.amazon.sqs.javamessaging;”正如文档中所指出的,它是Client_Acknowledge的变体,它仅确认为其调用的消息。
/**
* Non standard acknowledge mode. This is a variation of CLIENT_ACKNOWLEDGE
* where Clients need to remember to call acknowledge on message. Difference
* is that calling acknowledge on a message only acknowledge the message
* being called.
*/
依赖示例: “ com.amazonaws:amazon-sqs-java-messaging-lib:1.0.3”
答案 1 :(得分:1)
要处理这种情况,您可以对您创建的DLQ使用RedrivePolicy
属性。这种情况的解决方案可以是:
my_q
和my_q_dl
(后一个用于DLQ)my_q_dl
将DLQ my_q
设置为RedrivePolicy
的DLQ。 deadLetterTargetArn
和maxReceiveCount
。此maxReceiveCount
是您在将任何消息发送到DLQ之前未进行确认的情况下处理任何消息的次数。如果你设置maxReceiveCount
= 3那么,消费者没有确认时,消息将保持在my_q
最多3次拉动。
这里有2个案例:
my_q
中删除并推送到
my_q_dl
本身。* RedrivePolicy - 包含源队列的死信队列功能参数的字符串。
deadLetterTargetArn - Amazon SQS在值之后移动消息的死信队列的Amazon资源名称(ARN) 超出了maxReceiveCount。
maxReceiveCount - 在将消息移动到死信队列之前将消息传递到源队列的次数。
注意强> FIFO队列的死信队列也必须是FIFO队列。同样,标准队列的死信队列也必须是a 标准队列。*