在 Amazon SQS 中使用死信队列 - Amazon SDK for Java 1.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

我们宣布了即将推出 end-of-support 的 Amazon SDK for Java (v1)。建议您迁移到 Amazon SDK for Java v2。有关日期、其他详细信息以及如何迁移的信息,请参阅链接的公告。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon SQS 中使用死信队列

Amazon SQS 支持死信队列。死信队列是其他(源)队列可将其作为无法成功处理的消息的目标的队列。您可以在死信队列中留出和隔离这些消息以确定其处理失败的原因。

创建死信队列

死信队列的创建方式与常规队列相同,但有以下限制:

  • 死信队列必须与源队列属于相同的队列类型 (FIFO 或标准)。

  • 死信队列必须与源队列使用相同的 Amazon Web Services 账户和区域创建。

在这里,我们创建两个相同的 Amazon SQS 队列,其中一个用作死信队列:

导入

import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClientBuilder; import com.amazonaws.services.sqs.model.AmazonSQSException;

代码

final AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient(); // Create source queue try { sqs.createQueue(src_queue_name); } catch (AmazonSQSException e) { if (!e.getErrorCode().equals("QueueAlreadyExists")) { throw e; } } // Create dead-letter queue try { sqs.createQueue(dl_queue_name); } catch (AmazonSQSException e) { if (!e.getErrorCode().equals("QueueAlreadyExists")) { throw e; } }

请参阅 GitHub 上的完整示例

为源队列指定死信队列

要指定死信队列,您必须先创建一个重新驱动策略,然后在队列属性中设置该策略。重新驱动策略以 JSON 指定,并指定死信队列的 ARN,以及在向死信队列发送消息之前,允许接收但不处理消息的最大次数。

要为源队列设置重新驱动策略,请使用 SetQueueAttributesRequest 对象调用 AmazonSQS 类的 setQueueAttributes 方法,并使用您的 JSON 重新驱动策略为该对象设置 RedrivePolicy 属性。

导入

import com.amazonaws.services.sqs.model.GetQueueAttributesRequest; import com.amazonaws.services.sqs.model.GetQueueAttributesResult; import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;

代码

String dl_queue_url = sqs.getQueueUrl(dl_queue_name) .getQueueUrl(); GetQueueAttributesResult queue_attrs = sqs.getQueueAttributes( new GetQueueAttributesRequest(dl_queue_url) .withAttributeNames("QueueArn")); String dl_queue_arn = queue_attrs.getAttributes().get("QueueArn"); // Set dead letter queue with redrive policy on source queue. String src_queue_url = sqs.getQueueUrl(src_queue_name) .getQueueUrl(); SetQueueAttributesRequest request = new SetQueueAttributesRequest() .withQueueUrl(src_queue_url) .addAttributesEntry("RedrivePolicy", "{\"maxReceiveCount\":\"5\", \"deadLetterTargetArn\":\"" + dl_queue_arn + "\"}"); sqs.setQueueAttributes(request);

请参阅 GitHub 上的完整示例

更多信息