在SQS队列中确认消息

时间:2017-10-21 13:39:19

标签: java amazon-web-services jms message-queue amazon-sqs

我正在将 Amazon SQS 与带有Java EE 7的 Amazon SQS-JMS java库一起使用。我想要实现的是在收到消息后,取决于业务逻辑应用程序确认(使用)消息或再次将其重新发送到队列,并在3次重试失败后将其移至DLQ。

我在JMS中使用 CLIENT_Acknowledge 模式并且仅确认已成功处理的消息,但这来自他们的官方文档:

  

在此模式下,当确认消息时,也会隐式确认在此消息之前收到的所有消息。例如,如果收到10条消息,并且只确认了第10条消息(按照接收消息的顺序),那么之前的所有9条消息也会被确认。

这个例子似乎也证实了这一点:http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/code-examples.html#example-synchronous-receiver-client-acknowledge-mode

对我来说,这是一种奇怪的行为,与我对client_acknowledge的期望相反。这里有一个更优雅的解决方案,而不仅仅是根据流程状态在整个代码中手动发送消息到主SQS队列或DLQ吗?

2 个答案:

答案 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属性。这种情况的解决方案可以是:

  • 创建一个2平方码的Qs my_qmy_q_dl(后一个用于DLQ)
  • 使用my_q_dl将DLQ my_q设置为RedrivePolicy的DLQ。
  • 此处,应注意指定deadLetterTargetArnmaxReceiveCount。此maxReceiveCount是您在将任何消息发送到DLQ之前未进行确认的情况下处理任何消息的次数。如果你设置maxReceiveCount = 3那么,消费者没有确认时,消息将保持在my_q最多3次拉动。 这里有2个案例:
    • 正常情况:收到确认后立即删除msg。
    • 如果对于该msg没有确认(msg删除)到第三次,那么msg将从my_q中删除并推送到 my_q_dl本身。
  

* RedrivePolicy - 包含源队列的死信队列功能参数的字符串。

     
    

deadLetterTargetArn - Amazon SQS在值之后移动消息的死信队列的Amazon资源名称(ARN)     超出了maxReceiveCount。

         

maxReceiveCount - 在将消息移动到死信队列之前将消息传递到源队列的次数。

  
     

注意       FIFO队列的死信队列也必须是FIFO队列。同样,标准队列的死信队列也必须是a   标准队列。*