目录
一、准备工作
登录阿里云官网,先申请rocketMQ,再申请Topic、Group ID,然后就是参考阿里云的JAVA SDK进行编程实现。
环境要求:
安装JDK 1.8或以上版本
安装Maven
安装Java SDK
参照 阿里云 官方文档,来一步一步操作。
文档提供的SDK有TCP
和Http协议,这里使用TCP协议
来实现rocketMQ消息的发送与消费。
二、代码实现
调用TCP协议的SDK收发普通消息
1.添加依赖
创建Springboot项目,添加 SDK依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--aliyun mq tcp协议 sdk-->
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<!--以下版本号请替换为Java SDK的最新版本号-->
<version>2.0.3.Final</version>
</dependency>
注意:aliyun mq sdk的版本信息,请参见版本说明
2.创建一个常量类存放公共参数
package com.example.rocketdemotcp.config;
/**
* @author qzz
*/
public class MqConfigParams {
/**
* 你的topic
*/
public static final String TOPIC = "你的topic";
/**
* tag消息标签 *:代表全部
*/
public static final String TAG = "你的tag消息标签";
/**
* 你的Group_Id
*/
public static final String GROUP_ID = "你的Group_Id";
/**
*你的accessKey
*/
public static final String ACCESS_KEY = "你的accessKey";
/**
*你的secretKey
*/
public static final String SECRET_KEY = "你的secretKey";
/**
* 实例ID
*/
public static final String INSTANCE_ID = "你的实例ID";
/**
* 设置TCP协议客户端接入点,进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看
*/
public static final String NAMESRV_ADDR = "你的TCP接入点地址";
}
3.调用TCP协议的SDK 发送消息
package com.example.rocketdemotcp.util;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.example.rocketdemotcp.config.MqConfigParams;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;
/**
* 生产 阿里云 RocketMQ 消息(同步发送普通消息)
* @author qzz
*/
@Slf4j
public class ProducerTest {
public static void main(String[] args) {
Properties properties = new Properties();
// AccessKey ID,阿里云身份验证标识。获取方式,请参见创建AccessKey。
properties.put(PropertyKeyConst.AccessKey, MqConfigParams.ACCESS_KEY);
// AccessKey Secret,阿里云身份验证密钥。获取方式,请参见创建AccessKey。
properties.put(PropertyKeyConst.SecretKey, MqConfigParams.SECRET_KEY);
//设置发送超时时间,单位:毫秒。
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
// 设置TCP接入域名,进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看。
properties.put(PropertyKeyConst.NAMESRV_ADDR, MqConfigParams.NAMESRV_ADDR);
Producer producer = ONSFactory.createProducer(properties);
// 在发送消息前,必须调用start方法来启动Producer,只需调用一次即可。
producer.start();
//循环发送消息。
for (int i = 0; i < 1; i++){
Message msg = new Message(
// 普通消息所属的Topic,切勿使用普通消息的Topic来收发其他类型的消息。
MqConfigParams.TOPIC,
// Message Tag可理解为Gmail中的标签,对消息进行再归类,方便Consumer指定过滤条件在消息队列RocketMQ版的服务器过滤。
// Tag的具体格式和设置方法,请参见Topic与Tag最佳实践。
MqConfigParams.TAG,
// Message Body可以是任何二进制形式的数据,消息队列RocketMQ版不做任何干预。
// 需要Producer与Consumer协商好一致的序列化和反序列化方式。
"hello mq 123!".getBytes());
// 设置代表消息的业务关键属性,请尽可能全局唯一。
// 以方便您在无法正常收到消息情况下,可通过消息队列RocketMQ版控制台查询消息并补发。
// 注意:不设置也不会影响消息正常收发。
msg.setKey(UUID.randomUUID().toString());
try {
SendResult sendResult = producer.send(msg);
// 同步发送消息,只要不抛异常就是成功。
if (sendResult != null) {
System.out.println(new Date() + " Send mq message success. Topic is:" + msg.getTopic() + " msgId is: " + sendResult.getMessageId());
}
}
catch (Exception e) {
// 消息发送失败,需要进行重试处理,可重新发送这条消息或持久化这条数据进行补偿处理。
System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
e.printStackTrace();
}
}
// 在应用退出前,销毁Producer对象。
// 注意:销毁Producer对象可以节约系统内存,若您需要频繁发送消息,则无需销毁Producer对象。
producer.shutdown();
}
}
4.调用TCP协议的SDK 订阅消息
订阅消息的代码如下:
package com.example.rocketdemotcp.util;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.order.ConsumeOrderContext;
import com.aliyun.openservices.ons.api.order.MessageOrderListener;
import com.aliyun.openservices.ons.api.order.OrderAction;
import com.aliyun.openservices.ons.api.order.OrderConsumer;
import com.example.rocketdemotcp.config.MqConfigParams;
import java.util.Properties;
/**
* 消费 阿里云 RocketMQ 消息
* @author qzz
*/
public class ConsumerClient {
public static void main(String[] args) {
Properties properties = new Properties();
// 您在消息队列RocketMQ版控制台创建的Group ID。
properties.put(PropertyKeyConst.GROUP_ID, MqConfigParams.GROUP_ID);
// AccessKey ID,阿里云身份验证标识。获取方式,请参见创建AccessKey。
properties.put(PropertyKeyConst.AccessKey,MqConfigParams.ACCESS_KEY);
// AccessKey Secret,阿里云身份验证密钥。获取方式,请参见创建AccessKey。
properties.put(PropertyKeyConst.SecretKey,MqConfigParams.SECRET_KEY);
// 设置TCP接入域名,进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看。
properties.put(PropertyKeyConst.NAMESRV_ADDR,MqConfigParams.NAMESRV_ADDR);
// 顺序消息消费失败进行重试前的等待时间,单位(毫秒),取值范围: 10毫秒~30,000毫秒。
properties.put(PropertyKeyConst.SuspendTimeMillis,"100");
// 消息消费失败时的最大重试次数。
properties.put(PropertyKeyConst.MaxReconsumeTimes,"20");
// 在订阅消息前,必须调用start方法来启动Consumer,只需调用一次即可。
OrderConsumer consumer = ONSFactory.createOrderedConsumer(properties);
consumer.subscribe(
// Message所属的Topic。
MqConfigParams.TOPIC,
// 订阅指定Topic下的Tags:
// 1. * 表示订阅所有消息。
// 2. TagA || TagB || TagC表示订阅TagA或TagB或TagC的消息。
MqConfigParams.TAG,
new MessageOrderListener() {
/**
* 1. 消息消费处理失败或者处理出现异常,返回OrderAction.Suspend。
* 2. 消息处理成功,返回OrderAction.Success。
*/
@Override
public OrderAction consume(Message message, ConsumeOrderContext context) {
System.out.println("Received:"+message);
return OrderAction.Success;
}
});
consumer.start();
}
}
三、配置main的日志输出级别
启动执行时,发现问题:控制台打印巨多debug日志
默认情况下,如果项目中集成了Logback等日志框架,在执行main方法时通过其进行日志打印,那么默认的日志级别是debug的。
此时,如果是http请求,甚至可以把请求的具体报文信息都打印出来,特别是三方框架的。为了不影响查看正常的日志,可以将main方法的日志级别进行调整
。
解决方法:
resources目录下增加logback.xml
logback.xml:
<configuration debug="false">
<logger name="org.apache" level="INFO" />
<logger name="org.apache.http.wire" level="INFO" />
<logger name="org.apache.http.headers" level="INFO" />
<property name="CONSOLE_LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) %magenta(%-4relative) --- [%yellow(%15.15thread)] %cyan(%-40.40logger{39}) : %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="ERROR">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
再次启动,打印日志就简洁明多了。
四、测试效果
注意:先启动消费者程序,进行监听消息。
生产者启动运行,结果如下:
消费者监听消息结果如下:
五、完成代码
可点击此处进行下载