消息属性

轻量消息队列(原 MNS)的消息属性是在发送消息时添加的一种自定义元数据。消息属性不影响消息本身内容,可以根据实际应用场景来进行定制,满足不同应用场景的需求。

组成部分

每个消息属性由以下部分组成:

  • Name(名称):属性的唯一标识,数据类型为字符串。属性名称必须在此消息的所有属性中是唯一的,区分大小写,长度不能超过256个字符。

  • Type(类型):属性值的数据类型。轻量消息队列(原 MNS)支持StringNumberBooleanBinary四种数据类型。

  • Value(值):属性的具体内容,最大长度为4096个字符。

    说明

    对于Binary类型,其值在传输前会进行Base64编码,编码后的字符串长度同样不能超过4096个字符。

数据类型

轻量消息队列(原 MNS)消息属性支持以下数据类型:

数据类型

描述

String

字符串

可以存储任何有效的Unicode文本。

Number

字符串

可以存储正数或负数数值,包括整数、浮点数和科学记数法。轻量消息队列(原 MNS) 在传输时不验证该值是否为数字,但会将其作为字符串处理。

Boolean

"true""false"

可以存储布尔值。但是值必须为字符串形式的"true""false"

Binary

Base64编码的字符串

可以存储任何二进制数据,例如压缩数据、加密数据或图像。数据在发送时需要由SDK或客户端进行Base64编码,接收时进行解码。

说明

所有属性值(包括二进制数据)都是通过基于HTTP的协议以字符串形式传输。为了确保Binary类型的保真度,SDK会自动将其进行Base64编码和解码。如果未使用 轻量消息队列(原 MNS)提供的SDK,则需要自行处理Binary类型的Base64编解码。

使用限制

  • 属性数量

    每条消息最多可以包含50个消息属性。

  • 属性名称

    • 仅可以包含以下字符:A-Za-z0-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请求体中。每个属性都包含TypeValue字段。

    JSON示例

    {
      "TopicOwner": "1234567890",
      "TopicName": "MyTopic",
      "Subscriber": "1234567890",
      "SubscriptionName": "MySubscription",
      "Message": "This is a test message.",
      "MessageId": "A26DAA0E-26C1-5F09-8BCC-CA3F1590A308",
      "MessageMD5": "E784F7B224E9164608EAD4CC76410443",
      "TimeStamp": "2025-02-20T13:41:37.976Z",
      "UserProperties": {
        "source": {
          "Type": "STRING",
          "Value": "mobile-app"
        },
        "image_id": {
          "Type": "NUMBER",
          "Value": "98014"
        },
        "raw_data": {
          "Type": "BINARY",
          "Value": "aGVsbG8gd29ybGQ="
        }
      }
    }
  • XML:当格式为XML时,消息属性UserProperties会作为XML元素包含在推送的HTTP POST请求体中。

    XML示例

    <?xml version="1.0" encoding="UTF-8"?>
    <Notification>
        <TopicOwner>1234567890</TopicOwner>
        <TopicName>MyTopic</TopicName>
        <Subscriber>1234567890</Subscriber>
        <SubscriptionName>MySubscription</SubscriptionName>
        <Message>This is a test message.</Message>
        <MessageId>A26DAA0E-26C1-5F09-8BCC-CA3F1590A308</MessageId>
        <MessageMD5>E784F7B224E9164608EAD4CC76410443</MessageMD5>
        <TimeStamp>2025-02-20T13:41:37.976Z</TimeStamp>
        <UserProperties>
            <PropertyValue>
                <Name>source</Name>
                <Value>mobile-app</Value>
                <Type>STRING</Type>
            </PropertyValue>
            <PropertyValue>
                <Name>image_id</Name>
                <Value>98014</Value>
                <Type>NUMBER</Type>
            </PropertyValue>
            <PropertyValue>
                <Name>raw_data</Name>
                <Value>aGVsbG8gd29ybGQ=</Value>
                <Type>BINARY</Type>
            </PropertyValue>
        </UserProperties>
    </Notification>
  • SIMPLIFIED:当格式为SIMPLIFIED时,轻量消息队列(原 MNS)只会推送原始消息正文,不支持传递任何消息属性。

相关文档

轻量消息队列(原 MNS)主题订阅的操作请参见: