zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【设计模式】策略模式
    【设计模式】模板方法模式
    【C++】《Effective C++》第五章
    【C++】《Effective C++》第四章
    free命令详解(内存)
    top命令详解(动态进程)
    ps命令详解(静态进程)
    SpringBoot_集成Redis
    SpringBoot_热部署插件
    SpringBoot_实现RESTfull API
  • 原文地址:https://www.cnblogs.com/imgax/p/12893853.html
Copyright © 2011-2022 走看看