轻量消息队列(原 MNS)的消息属性是在发送消息时添加的一种自定义元数据。消息属性不影响消息本身内容,可以根据实际应用场景来进行定制,满足不同应用场景的需求。
组成部分
每个消息属性由以下部分组成:
Name(名称):属性的唯一标识,数据类型为字符串。属性名称必须在此消息的所有属性中是唯一的,区分大小写,长度不能超过256个字符。
Type(类型):属性值的数据类型。轻量消息队列(原 MNS)支持
String
、Number
、Boolean
和Binary
四种数据类型。Value(值):属性的具体内容,最大长度为4096个字符。
说明对于
Binary
类型,其值在传输前会进行Base64编码,编码后的字符串长度同样不能超过4096个字符。
数据类型
轻量消息队列(原 MNS)消息属性支持以下数据类型:
数据类型 | 值 | 描述 |
| 字符串 | 可以存储任何有效的Unicode文本。 |
| 字符串 | 可以存储正数或负数数值,包括整数、浮点数和科学记数法。轻量消息队列(原 MNS) 在传输时不验证该值是否为数字,但会将其作为字符串处理。 |
|
| 可以存储布尔值。但是值必须为字符串形式的 |
| Base64编码的字符串 | 可以存储任何二进制数据,例如压缩数据、加密数据或图像。数据在发送时需要由SDK或客户端进行Base64编码,接收时进行解码。 |
所有属性值(包括二进制数据)都是通过基于HTTP的协议以字符串形式传输。为了确保Binary
类型的保真度,SDK会自动将其进行Base64编码和解码。如果未使用 轻量消息队列(原 MNS)提供的SDK,则需要自行处理Binary
类型的Base64编解码。
使用限制
属性数量
每条消息最多可以包含50个消息属性。
属性名称
仅可以包含以下字符:
A-Z
、a-z
、0-9
、下划线(_
)、短划线(-
)和半角句号(.
)。最长可为 256 个字符。
区分大小写。
必须在消息的所有属性名称中唯一。
不能以半角句号(
.
)开头或结尾。不能有连续的半角句号(
.
)(例如"example..name"
)。
属性值
属性值的最大长度为4096个字符。
消息总体大小
所有消息属性(包括名称、类型和值)的总大小均计入轻量消息队列(原 MNS)的消息总大小限制中。轻量消息队列(原 MNS)消息大小限制,请参见使用限制。
使用示例
写入消息属性
// 1. 创建一个消息对象
Message message = new Message();
message.setMessageBody("这是消息正文");
// 2. 创建一个 Map 用于存储消息属性
Map<String, MessagePropertyValue> userProperties = new HashMap<>();
// 3. 为每个支持的类型添加属性
// String 类型
userProperties.put("city", new MessagePropertyValue("hangzhou"));
// Number 类型 (整数)
userProperties.put("priority", new MessagePropertyValue(10));
// Number 类型 (浮点数)
userProperties.put("temperature", new MessagePropertyValue(-5.5));
// Boolean 类型
userProperties.put("is_vip", new MessagePropertyValue(true));
// Binary 类型
byte[] binaryData = "some-binary-data".getBytes();
userProperties.put("attachment", new MessagePropertyValue(binaryData));
// 4. 将属性设置到消息中
message.setUserProperties(userProperties);
读取消息属性
// 假设 'receivedMessage' 是您已获得的一个 Message 对象
// Message receivedMessage = ...;
// 1. 从消息中获取属性 Map
Map<String, MessagePropertyValue> userProperties = receivedMessage.getUserProperties();
if (userProperties != null && !userProperties.isEmpty()) {
// 2. 读取并解析每个类型的属性
// 读取 String
String city = userProperties.get("city").getStringValue();
System.out.println("City (String): " + city);
// 读取 Number (并解析为 Double)
double temperature = Double.parseDouble(userProperties.get("temperature").getStringValue());
System.out.println("Temperature (Number as Double): " + temperature);
// 读取 Number (并解析为 Integer)
int priority = Integer.parseInt(userProperties.get("priority").getStringValue());
System.out.println("Priority (Number as Integer): " + priority);
// 读取 Boolean (并解析)
boolean isVip = Boolean.parseBoolean(userProperties.get("is_vip").getStringValue());
System.out.println("Is VIP (Boolean): " + isVip);
// 读取 Binary
byte[] attachment = userProperties.get("attachment").getBinaryValue();
System.out.println("Attachment (Binary): " + new String(attachment));
}
在订阅端点读取消息属性
消息属性仅支持队列订阅和HTTP订阅,其他类型的订阅暂时不支持。
队列订阅
当消息被推送到轻量消息队列(原 MNS)队列订阅端点时,消息属性会作为 Message
对象的一部分一同传递。您可以像接收普通消息一样接收消息,然后通过 Message
对象提供的方法来访问 userProperties
。使用示例请参见读取消息属性。
HTTP订阅
当消息被推送到HTTP订阅端点时,消息属性的格式取决于您在创建订阅时设置的消息格式(订阅的NotifyContentFormat
属性):
JSON:当格式为
JSON
时,消息属性UserProperties
会作为一个JSON
对象包含在推送的HTTP POST请求体中。每个属性都包含Type
和Value
字段。XML:当格式为
XML
时,消息属性UserProperties
会作为XML
元素包含在推送的HTTP POST请求体中。SIMPLIFIED:当格式为
SIMPLIFIED
时,轻量消息队列(原 MNS)只会推送原始消息正文,不支持传递任何消息属性。
相关文档
轻量消息队列(原 MNS)主题订阅的操作请参见: