项目中要用到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