springboot2 整合 rocketmq
引入依赖pom:
<!-- TCP Java SDK ,生产者com.aliyun.openservices.ons.api.Producer,消费者,以及消息,消息内容Message message, ConsumeContext context等类 --> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>ons-client</artifactId> <version>1.8.0.Final</version> </dependency>
初始化生产者,和消费者,直接上代码
package com.example.demo.rocketmq.init; import java.util.Date; import java.util.Properties; import java.util.UUID; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.aliyun.openservices.ons.api.Message; import com.aliyun.openservices.ons.api.ONSFactory; import com.aliyun.openservices.ons.api.Producer; import com.aliyun.openservices.ons.api.PropertyKeyConst; import com.aliyun.openservices.ons.api.SendResult; import com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl; import com.aliyun.openservices.shade.com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl; import com.aliyun.openservices.shade.com.alibaba.rocketmq.client.producer.DefaultMQProducer; /** * 初始化生产者 * @author zel * @date 2019年3月31日 上午11:37:27 * */ @Component public class RocketmqProducerInit { private static final Logger logger = LoggerFactory.getLogger(RocketmqProducerInit.class); // @Value("${rocketmq.topic}") // private String topic; @Value("${rocketmq.groupid}") private String groupId; @Value("${rocketmq.accessKey}") private String accessKey; @Value("${rocketmq.secretKey}") private String secretKey; @Value("${rocketmq.namesrvAddr}") private String namesrvAddr; private static Producer producer; private static class SingletonHolder { private static final RocketmqProducerInit INSTANCE = new RocketmqProducerInit(); } private RocketmqProducerInit() { } public static final RocketmqProducerInit getInstance() { return SingletonHolder.INSTANCE; } @PostConstruct public void init() { // producer 实例配置初始化 Properties properties = new Properties(); properties.setProperty(PropertyKeyConst.GROUP_ID, groupId); // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 properties.put(PropertyKeyConst.AccessKey, accessKey); // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 properties.put(PropertyKeyConst.SecretKey, secretKey); // 设置发送超时时间,单位毫秒 properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, String.valueOf(1000*3));//超时时间 // 设置 TCP 接入域名,到控制台的实例基本信息中查看 properties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr); producer = ONSFactory.createProducer(properties); producer.start(); //获取是否运行状态 // if (producer instanceof ProducerImpl) { // System.out.println("它是DefaultMQProducerImpl实例"); // ProducerImpl producerImpl = (ProducerImpl) producer; // DefaultMQProducerImpl defaultMQProducerImpl = producerImpl.getDefaultMQProducer().getDefaultMQProducerImpl(); // logger.info("start前状态字段值:" + defaultMQProducerImpl.getServiceState()); // producer.start(); // logger.info("start后状态字段值:" + defaultMQProducerImpl.getServiceState()); // } } /** * @param type simple:无序消息;order:顺序消息;Transaction:事务消息; * @return */ public Producer getProducer() { return producer; } }
package com.example.demo.rocketmq.init; import java.util.Properties; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.aliyun.openservices.ons.api.Consumer; import com.aliyun.openservices.ons.api.ONSFactory; import com.aliyun.openservices.ons.api.PropertyKeyConst; import com.example.demo.controller.RocketmqEvaluateListener; import com.example.demo.controller.RocketmqSMSReminderListener; import com.example.demo.controller.RocketmqWWlogListener; /** * 初始化消费者 * @author zel * @date 2019年3月31日 上午11:38:16 * */ @Component //@Configuration //@ConditionalOnProperty(value = "rocketmqConsumerInit.enabled", havingValue = "true", matchIfMissing = true) public class RocketmqConsumerInit { private Logger logger = LoggerFactory.getLogger(RocketmqConsumerInit.class); private static Consumer consumer; @Value("${rocketmq.topic}") private String topic; @Value("${rocketmq.topicsms}") private String topicsms; @Value("${rocketmq.tag}") private String tag; @Value("${rocketmq.groupid}") private String groupId; // @Value("${rocketmq.topicevaluate}") // private String topicevaluate; @Value("${rocketmq.accessKey}") private String accessKey; @Value("${rocketmq.secretKey}") private String secretKey; @Value("${rocketmq.namesrvAddr}") private String namesrvAddr; @PostConstruct public void consumerFactory(){//不同消费者 这里不能重名 Properties consumerProperties = new Properties(); // 您在控制台创建的 Group ID consumerProperties.put(PropertyKeyConst.GROUP_ID, groupId); // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 consumerProperties.put(PropertyKeyConst.AccessKey, accessKey); // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 consumerProperties.put(PropertyKeyConst.SecretKey, secretKey); // 设置 TCP 接入域名,到控制台的实例基本信息中查看 consumerProperties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr); // 集群订阅方式 (默认) // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING); // 广播订阅方式 // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); consumer = ONSFactory.createConsumer(consumerProperties); logger.info("topic:"+topic+",tag:"+tag); consumer.subscribe(topic, tag, new RocketmqWWlogListener()); // consumer.subscribe("testtopic", "TagA2BPublishTest", new RocketmqTest1Listener()); //订阅另外一个 状态发送变化发送短信Topic consumer.subscribe(topicsms, "*", new RocketmqSMSReminderListener()); //订阅另外一个 自动评价 Topic //consumer.subscribe(topicevaluate, "*", new RocketmqEvaluateListener()); // consumer.subscribe(topicsms, tagSMS, new MessageListener() { //订阅多个 Tag // public Action consume(Message message, ConsumeContext context) { // logger.info("短信消息队列消费监听Receive: " + new String(message.getBody())); // //调用发送短信接口 // return Action.CommitMessage; // } // }); //在发送消息前,必须调用start方法来启动consumer,只需调用一次即可,当项目关闭时,自动shutdown consumer.start(); logger.info("ConsumerConfig start success."); } /** * 初始化消费者 * @return */ public Consumer getconsumer(){ return consumer; } }
生产者测试类:使用测试的topic【testtopic】测试
- 设置基本属性【GroupId、AccessKey 、SecretKey、TCP 接入域名等】
- 创建生产者
- 并.Start(),
- 发送消息.send(msg【topic、tag、Message Body任何二进制形式的数据】)
- 根据Message类型(不同topic、tag)发送不同消息给不同订阅者

package com.example.demo.rocketmq; 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 java.util.Date; import java.util.Properties; public class ProducerTest { public static void main(String[] args) { Properties properties = new Properties(); properties.setProperty(PropertyKeyConst.GROUP_ID, "GID_testgroup"); // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 properties.put(PropertyKeyConst.AccessKey,"LTAId2oS8TzH82lH"); // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 properties.put(PropertyKeyConst.SecretKey, "abHRyVHZYHmeBCEmM6uXQaQXbbWHtk"); //设置发送超时时间,单位毫秒 properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000"); // 设置 TCP 接入域名,到控制台的实例基本信息中查看 properties.put(PropertyKeyConst.NAMESRV_ADDR, "http://MQ_INST_1356501_BaSQ7VE8.mq-internet-access.mq-internet.aliyuncs.com:80"); Producer producer = ONSFactory.createProducer(properties); // 在发送消息前,必须调用 start 方法来启动 Producer,只需调用一次即可 producer.start(); //循环发送消息 for (int i = 0; i < 100; i++){ Message msg = new Message( // // Message 所属的 Topic "testtopic", // Message Tag 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在 MQ 服务器过滤 "TagA", // Message Body 可以是任何二进制形式的数据, MQ 不做任何干预, // 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式 "Hello MQ".getBytes()); // 设置代表消息的业务关键属性,请尽可能全局唯一。 // 以方便您在无法正常收到消息情况下,可通过阿里云服务器管理控制台查询消息并补发 // 注意:不设置也不会影响消息正常收发 msg.setKey("ORDERID_" + i); 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.shutdown(); } }
消费者测试类:
- 设置基本属性【GroupId、AccessKey 、SecretKey、TCP 接入域名、订阅方式等】,
- 创建消费者,
- 并订阅subscribe(topic, tag, MessageListener接口实现类实例【内部实现consume方法】)
- 订阅多个不同Message(不同topic、tag),不同consume方法。

package com.example.demo.rocketmq; import com.aliyun.openservices.ons.api.Action; import com.aliyun.openservices.ons.api.ConsumeContext; import com.aliyun.openservices.ons.api.Consumer; import com.aliyun.openservices.ons.api.Message; import com.aliyun.openservices.ons.api.MessageListener; import com.aliyun.openservices.ons.api.ONSFactory; import com.aliyun.openservices.ons.api.PropertyKeyConst; import java.util.Properties; public class ConsumerTest { public static void main(String[] args) { Properties properties = new Properties(); // 您在控制台创建的 Group ID properties.put(PropertyKeyConst.GROUP_ID, "GID_testgroup"); // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 properties.put(PropertyKeyConst.AccessKey, "LTAId2oS8TzH82lH"); // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 properties.put(PropertyKeyConst.SecretKey, "abHRyVHZYHmeBCEmM6uXQaQXbbWHtk"); // 设置 TCP 接入域名,到控制台的实例基本信息中查看 properties.put(PropertyKeyConst.NAMESRV_ADDR, "http://MQ_INST_1356501_BaSQ7VE8.mq-internet-access.mq-internet.aliyuncs.com:80"); // 集群订阅方式 (默认) 分摊消费,即:生产20条消息,启动两个消费者,两个消费者消费加起来一共消费20条(11+9条,10+10条) // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING); // 广播订阅方式,启动两个消费者,理论上是各自消费二十条数据,消费端的消费方式是多线程消费的 // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); Consumer consumer = ONSFactory.createConsumer(properties); consumer.subscribe("testtopic", "TagA||TagB", new MessageListener() { //订阅多个 Tag public Action consume(Message message, ConsumeContext context) { System.out.println("Receive: " + message); return Action.CommitMessage; } }); //订阅另外一个 Topic(订阅多个topic,同时要保证consumer里的多个消费者实例订阅关系一致性) consumer.subscribe("TopicTestMQ-Other", "*", new MessageListener() { //订阅全部 Tag public Action consume(Message message, ConsumeContext context) { System.out.println("Receive: " + message); return Action.CommitMessage; } }); consumer.start(); System.out.println("Consumer Started"); } }
可根据需要发送不同类型消息到消息队列
源码,是痛苦的,又是快乐的,如果没有这痛苦,也就没有了这快乐!
本文作者:好Wu赖
本文链接:https://www.cnblogs.com/erlongxizhu-03/p/10580962.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现