

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

# 在 &SQS; 中使用死信队列
<a name="examples-sqs-dead-letter-queues"></a>

Amazon SQS 支持死信队列**。死信队列是一个专门接收其他队列中无法被成功处理的消息的队列。您可以在死信队列中留出和隔离这些消息以确定其处理失败的原因。

要创建死信队列，您必须先创建一个重新驱动策略**，然后在队列属性中设置该策略。

**重要**  
死信队列必须与源队列属于相同的队列类型（FIFO 或标准）。还必须使用与源队列 AWS 区域 相同 AWS 账户 的 and 来创建它。

## 先决条件
<a name="codeExamplePrereq"></a>

在开始之前，建议您先阅读[开始使用 适用于 C\+\+ 的 AWS SDK](getting-started.md)。

下载示例代码并按[代码示例入门](getting-started-code-examples.md)中所述构建解决方案。

要运行这些示例，您的代码用于发出请求的用户配置文件必须具有适当的权限 AWS （适用于服务和操作）。有关更多信息，请参阅[提供 AWS 凭证](credentials.md)。

## 创建重新驱动策略
<a name="sqs-dead-letter-queue-create-redrive-policy"></a>

重新驱动策略在 JSON 中指定。要创建重新驱动策略，您可以使用 适用于 C\+\+ 的 AWS SDK随附的 JSON 实用程序类。

这是一个示例函数，它通过为您提供死信队列的 ARN 和消息在被发送到死信队列之前可以被接收而不被处理的最大次数来创建一个重新驱动策略。

 **包含** 

```
#include <aws/core/Aws.h>
#include <aws/core/utils/json/JsonSerializer.h>
```

 **代码** 

```
Aws::String MakeRedrivePolicy(const Aws::String &queueArn, int maxReceiveCount) {
    Aws::Utils::Json::JsonValue redrive_arn_entry;
    redrive_arn_entry.AsString(queueArn);

    Aws::Utils::Json::JsonValue max_msg_entry;
    max_msg_entry.AsInteger(maxReceiveCount);

    Aws::Utils::Json::JsonValue policy_map;
    policy_map.WithObject("deadLetterTargetArn", redrive_arn_entry);
    policy_map.WithObject("maxReceiveCount", max_msg_entry);

    return policy_map.View().WriteReadable();
}
```

请参阅[完整示例](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sqs/dead_letter_queue.cpp)。

## 在源队列上设置重新驱动策略
<a name="sqs-dead-letter-queue-set-redrive-policy"></a>

要完成死信队列的设置，请使用已通过 JSON redriv SQSClient e 策略为其设置`RedrivePolicy`属性的[SetQueueAttributesRequest](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-sqs/html/class_aws_1_1_s_q_s_1_1_model_1_1_set_queue_attributes_request.html)对象调用类的`SetQueueAttributes`成员函数。

 **包含** 

```
#include <aws/sqs/SQSClient.h>
#include <aws/sqs/model/SetQueueAttributesRequest.h>
#include <iostream>
```

 **代码** 

```
    Aws::SQS::Model::SetQueueAttributesRequest request;
    request.SetQueueUrl(srcQueueUrl);
    request.AddAttributes(
            Aws::SQS::Model::QueueAttributeName::RedrivePolicy,
            redrivePolicy);

    const Aws::SQS::Model::SetQueueAttributesOutcome outcome =
            sqsClient.SetQueueAttributes(request);
    if (outcome.IsSuccess()) {
        std::cout << "Successfully set dead letter queue for queue  " <<
                  srcQueueUrl << " to " << deadLetterQueueARN << std::endl;
    }
    else {
        std::cerr << "Error setting dead letter queue for queue " <<
                  srcQueueUrl << ": " << outcome.GetError().GetMessage() <<
                  std::endl;
    }
```

请参阅[完整示例](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sqs/dead_letter_queue.cpp)。

## 更多信息
<a name="more-info"></a>
+  《Amazon Simple Queue Service 开发人员指南》中的[使用 Amazon SQS 死信队列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)
+  [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)在 Amazon 简单队列服务 API 参考中