

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

# 将消息属性发送到 Amazon SQS 队列
<a name="sqs-java-send-message-with-attributes"></a>

您可以使用*消息属性*，在消息中包括结构化元数据（如时间戳、地理空间数据、签名和标识符）。有关更多信息，请参阅 [Amazon SQS 消息属性](sqs-message-metadata.md#sqs-message-attributes)。

 在运行示例代码之前，请确保已设置 AWS 凭据。有关更多信息，请参阅《*AWS SDK for Java 2.x 开发人员指南》中的设置开发 AWS *[凭证和区域](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html#setup-credentials)。

## 定义属性
<a name="sqs-java-define-attributes"></a>

要为消息定义属性，请添加使用 `[MessageAttributeValue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_MessageAttributeValue.html)` 数据类型的以下代码。有关更多信息，请参阅[消息属性组件](sqs-message-metadata.md#message-attribute-components)和[消息属性数据类型](sqs-message-metadata.md#message-attribute-data-types)。

会 适用于 Java 的 AWS SDK 自动计算消息正文和消息属性的校验和，并将它们与 Amazon SQS 返回的数据进行比较。有关更多信息，请参阅 *[AWS SDK for Java 2.x 开发人员指南](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/)*；有关其他编程语言，请参阅[计算 MD5 消息属性的消息摘要](sqs-message-metadata.md#sqs-attributes-md5-message-digest-calculation)。

------
#### [ String ]

此示例定义 `String` 属性，其名称为 `Name`，值为 `Jane`。

```
final Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
messageAttributes.put("Name", new MessageAttributeValue()
.withDataType("String")
.withStringValue("Jane"));
```

------
#### [ Number ]

此示例定义 `Number` 属性，其名称为 `AccurateWeight`，值为 `230.000000000000000001`。

```
final Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
messageAttributes.put("AccurateWeight", new MessageAttributeValue()
.withDataType("Number")
.withStringValue("230.000000000000000001"));
```

------
#### [ Binary ]

此示例定义 `Binary` 属性，其名称为 `ByteArray`，值为未初始化的 10 字节数组。

```
final Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
messageAttributes.put("ByteArray", new MessageAttributeValue()
.withDataType("Binary")
.withBinaryValue(ByteBuffer.wrap(new byte[10])));
```

------
#### [ String (custom) ]

此示例定义自定义属性 `String.EmployeeId`，其名称为 `EmployeeId`，值为 `ABC123456`。

```
final Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
messageAttributes.put("EmployeeId", new MessageAttributeValue()
.withDataType("String.EmployeeId")
.withStringValue("ABC123456"));
```

------
#### [ Number (custom) ]

此示例定义自定义属性 `Number.AccountId`，其名称为 `AccountId`，值为 `000123456`。

```
final Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
messageAttributes.put("AccountId", new MessageAttributeValue()
.withDataType("Number.AccountId")
.withStringValue("000123456"));
```

**注意**  
由于基本数据类型为 `Number`，`[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)` 方法会返回 `123456`。

------
#### [ Binary (custom) ]

此示例定义自定义属性 `Binary.JPEG`，其名称为 `ApplicationIcon`，值为未初始化的 10 字节数组。

```
final Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
messageAttributes.put("ApplicationIcon", new MessageAttributeValue()
.withDataType("Binary.JPEG")
.withBinaryValue(ByteBuffer.wrap(new byte[10])));
```

------

## 发送带有属性的消息
<a name="sqs-java-send-attributes"></a>

此示例在发送消息之前将属性添加到 `SendMessageRequest` 中。

```
// Send a message with an attribute.
final SendMessageRequest sendMessageRequest = new SendMessageRequest();
sendMessageRequest.withMessageBody("This is my message text.");
sendMessageRequest.withQueueUrl(myQueueUrl);
sendMessageRequest.withMessageAttributes(messageAttributes);
sqs.sendMessage(sendMessageRequest);
```

**重要**  
如果您向 First-In-First-Out (FIFO) 队列发送消息，请确保在提供消息组 *ID 后*执行该`sendMessage`方法。  
如果您使用 `[SendMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)` 方法而非 `[SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)`，则必须指定批处理中每条消息的消息属性。