2020-05-15 rocketmq-spring-starter结合disconf使用

项目中要用到rocketmq,想要封装一个方便使用的client,网上搜索到官方的一个项目:

https://github.com/apache/rocketmq-spring

简单写了demo测试了下,感觉用起来接近rabbitmq,决定在实际项目里测试下。
disconf配置如下:

rocketmq.name-server=127.0.0.1:9876
rocketmq.producer.group=test-group

实际测试结果RocketMQTemplate无法初始化,网上查了不少资料没有结果。

翻阅rocketmq-spring-boot的源码,RocketMQTemplate由
RocketMQAutoConfiguration内完成初始化,
观察到该类使用了以下注解:

@ConditionalOnProperty(prefix = "rocketmq", value = "name-server", matchIfMissing = true)
@ConditionalOnProperty(prefix = "rocketmq", value = {"name-server", "producer.group"})

两个注解在RocketMQTemplate、RocketMQAutoConfiguration初始化之前判断配置文件里是否有必须的配置项。

具体判断实现类:

@Order(-2147483608)
org.springframework.boot.autoconfigure.condition.OnPropertyCondition

debug分析,OnPropertyCondition初始化完成时没有读到disconf配置项,
猜测是@Order(-2147483608)导致的,考虑去掉ConditionalOnProperty的检查。
自行修改RocketMQAutoConfiguration,重新打包后,果然可以初始化了。

这样修改也带来了一些缺点,一些纯粹的Consumer应用内也初始化了RocketMQTemplate,而这是不必要的,后续可以再自行实现org.springframework.context.annotation.Condition优化下。

使用的版本:

rocketmq-client 4.5.2
rocketmq-spring-starter 2.0.5-SNAPSHOT
原文地址:https://www.cnblogs.com/imgax/p/12893853.html