本文介绍如何使用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();
}
}
文档内容是否对您有帮助?