Spring RockerMQ 各个集成版本情况与为什么自己集成
Spring Cloud 官方方案 Spring Cloud Stream RocketMQ
最优选择
优点:
- 方案为Spring Cloud 官方 方案
- 是对所有MQ的一个更高的抽象,屏蔽了不同MQ的差异。
- 不用改代码就可以切换MQ环境
缺点:
- 改变了现有使用方式,需要重新适应
- 需要重新进行培训。
放弃原因:
- 公司现有服务是基于 spirng boot 1.5.* 对应的 spring cloud 也是老版本。
- 使用阿里提供的1.2版本,对应的是spring boot 1.5.* 也是老版本,可能是最早版本。
- 阿里并未提供生产者的实现方式,实现方式直接为空!
Spring Boot官方方案 Spring Boot RocketMQ
阿帕奇官方适配Spring boot 方案
优点:
- 官方提供是boot化方案
- 注解形式开发
- 使用简单
缺点
- 注解化可以使用多个队列,容易出错。
- 生产消息不会返回生成消息的ID等信息,只有是否成功。
放弃原因:
- 不支持 spring boot 1.5.* ,最低为 2.0.* 版本。
- 具体原因为 spirng boot 1.5.* 的spring 版本为 4.* spring boot 2.0.* 为 spring 5.0 、 spring boot 2.1.* 为spirng 5.1
- 需要修改源码,问题原因在 通过注解动态创建一个生产者的时候, 低版本的 spring 没有对应初始化类方法。
- 代码研究完了,并不复杂。但是综合各自情况,还是不适合我们。
RocketMQ原生装饰方案(当前方案)
- 基于原生进行装饰。
- 生产者,直接注入生产者对象就可使用。
- 消费者,实现消费接口方案,自动调用。
- 基本不改变现有开发习惯。
开源地址:
spirng boot 插件模式
添加依赖:
当前版本为 0.1.0 ,请检查是否有最新版本。
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.zjs.mic</groupId>
<artifactId>zjs-spring-boot-mq</artifactId>
<version>最新版本</version>
</dependency>
使用示例:
@Component
public class MessageListener implements MessageListenerConsumerInterface
{
@Autowired
private MqProducer mqProducer;
/**
* 生成者使用示例
*/
public void sendMQ()
{
try {
mqProducer.send("","","");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 消费者使用示例
*/
@Override
public ConsumeConcurrentlyStatus consumeMessage(String strBody, MessageExt msg, ConsumeConcurrentlyContext context) {
System.out.println(strBody);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
配置:
rocketmq:
# Name Server 地址列表
namesrvAddr: 10.10.0.01:9876;10.10.0.02:9876
# Producer 组名, 多个 Producer 如果属于一 个应用,发送同样的消息,则应该将它们 归为同一组
producerGroupName: testliwen
# 生产者名称
instanceName: testliwen
# 超时时间 默认 20000
sendMsgTimeout: 20000
# 消费端组名
consumerGroup: atliwenconsumer
# 消息处理次数 默认12 只是服务自己判断,非 rocketmq 自身 -1 为不生效
# 没有实现 MqExceedCountInterface 接口的 bean 也不会触发。
count: 12
# 消费端 Topic
Topics:
- {Topic: 'testAAA', Tags: '*'}