发送消息示例

本文介绍如何使用Java SDK进行消息发送。

前提条件

授权信息

默认仅限阿里云账号使用本接口,RAM用户只有在被授予了相关API操作权限后方可使用。本接口的授权信息如下表所示。

Name

Value

API

SendMessage

RAM授权操作

mns:SendMessage

资源

acs:mns:$region:$accountid:/queues/$queueName/messages

使用说明

  • 该接口用于发送消息到指定的队列,普通消息发送到队列立即被消费者消费。如果生产者发送一个消息不想立即被消费者消费(典型的使用场景为定期任务),生产者可以在发送消息时设置DelaySeconds参数。发送带DelaySeconds参数值大于0的消息初始状态为Delayed,此时消息不能被消费者消费,只有等DelaySeconds时间后消息变成Active状态后才可以被消费。

  • 发送消息时指定DelaySeconds参数的优先级高于延时队列的DelaySeconds属性,即两个DelaySeconds属性设置的值不同的时候以发送消息时指定的值为准。

  • 当调用API发送消息时,建议您将消息体进行Base64编码,以免存在特殊字符导致不能正常使用。

  • 本文示例代码中的Endpoint以您实际环境配置为主。若仅用于本地测试,可用公网域名,若需要上线使用,推荐使用内网Endpoint。SMQ支持的地域与Endpoint的对应关系,请参见功能开服和接入点

消息体编码选择

当消息体无特殊字符时,建议您不使用Base64编码。

  • 发送消息时使用message.setMessageBodyAsRawString方法设置消息体。

  • 接收消息时使用meesage.getMessageBodyAsRawString方法获取消息体。

示例代码

示例代码下载,请参见SendMessageDemo

import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudQueue;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.ClientException;
import com.aliyun.mns.common.ServiceException;
import com.aliyun.mns.common.utils.ServiceSettings;
import com.aliyun.mns.model.Message;

/**
 * 1. 遵循阿里云规范,env设置ak、sk。
 * 2. ${"user.home"}/.aliyun-mns.properties 文件配置如下:
 *           mns.endpoint=http://xxxxxxx
 *           mns.msgBodyBase64Switch=true/false
 */
public class SendMessageDemo {

    /**
     * replace with your queue name
     */
    private static final String QUEUE_NAME = "cloud-queue-demo";

    private static final Boolean IS_BASE64 = Boolean.valueOf(ServiceSettings.getMNSPropertyValue("msgBodyBase64Switch","false"));


    public static void main(String[] args) {
        // 遵循阿里云规范,env设置ak、sk,
        CloudAccount account = new CloudAccount(ServiceSettings.getMNSAccountEndpoint());
        MNSClient client = account.getMNSClient();

        // Demo for send message code, send 10 test message
        try {
            CloudQueue queue = client.getQueueRef(QUEUE_NAME);
            for (int i = 0; i < 10; i++) {
                Message message = new Message();
                String messageValue = "demo_message_body" + i;
                if (IS_BASE64) {
                    // base 64编码
                    message.setMessageBody(messageValue);
                }else {
                    // 不进行任何编码
                    message.setMessageBodyAsRawString(messageValue);
                }

                Message putMsg = queue.putMessage(message);
                System.out.println("Send message id is: " + putMsg.getMessageId());
            }
        } catch (ClientException ce) {
            System.out.println("Something wrong with the network connection between client and MNS service."
                + "Please check your network and DNS availablity.");
            ce.printStackTrace();
        } catch (ServiceException se) {
            if (se.getErrorCode().equals("QueueNotExist")) {
                System.out.println("Queue is not exist.Please create before use");
            } else if (se.getErrorCode().equals("TimeExpired")) {
                System.out.println("The request is time expired. Please check your local machine timeclock");
            }
            se.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknown exception happened!");
            e.printStackTrace();
        }

        client.close();
    }

}