解决SpringBoot2.1.0+RocketMQ版本冲突问题

 更新时间:2024年06月17日 15:32:28   作者:万物~  
这篇文章主要介绍了解决SpringBoot2.1.0+RocketMQ版本冲突问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

介绍

  • 我的项目使用的是springboot2.1.0
  • rocketmq-spring-boot-starter 使用的是2.0.2
  • RocketMQ-client使用的版本是4.3.2
  • RocketMQ使用阿里云的docker搭建

列一下主要的pom

<!--RocketMQ相关-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.4.0</version>
        </dependency>

application.properties配置

# RocketMQ相关配置
spring.rocketmq.nameServer=ip:9876
spring.rocketmq.producer.group=test

代码

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

     public void test(){
        try {
            // 使用rockMq发送消息
            HashMap<String, Object> msg = new HashMap<>(2);
            msg.put("id",user.getId());
            msg.put("mobile",mobile);
            msg.put("date",new Date());
            this.rocketMQTemplate.convertAndSend("login",msg);
        }catch (Exception e){
            LOGGER.error("发送消息出错",e);
        }
}

然后关键来了,项目启动后报错

Description:

Field rocketMQTemplate in com.tanhua.sso.service.UserService required a bean of type 'org.apache.rocketmq.spring.core.RocketMQTemplate' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

The following candidates were found but could not be injected:
    - Bean method 'rocketMQTemplate' in 'RocketMQAutoConfiguration' not loaded because @ConditionalOnProperty (rocketmq.name-server) did not find property 'name-server'


Action:

Consider revisiting the entries above or defining a bean of type 'org.apache.rocketmq.spring.core.RocketMQTemplate' in your configuration.

这里网上查了很多资料都没有解决,定位到问题的原因是因为org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration类的问题

@Configuration
@EnableConfigurationProperties(RocketMQProperties.class)
@ConditionalOnClass({ MQAdmin.class, ObjectMapper.class })
@ConditionalOnProperty(prefix = "rocketmq", value = "name-server")
@Import({ JacksonFallbackConfiguration.class, ListenerContainerConfiguration.class })
@AutoConfigureAfter(JacksonAutoConfiguration.class)
public class RocketMQAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(DefaultMQProducer.class)
    @ConditionalOnProperty(prefix = "rocketmq", value = {"name-server", "producer.group"})
    public DefaultMQProducer defaultMQProducer(RocketMQProperties rocketMQProperties) {
        RocketMQProperties.Producer producerConfig = rocketMQProperties.getProducer();
        String nameServer = rocketMQProperties.getNameServer();
        String groupName = producerConfig.getGroup();
        Assert.hasText(nameServer, "[rocketmq.name-server] must not be null");
        Assert.hasText(groupName, "[rocketmq.producer.group] must not be null");

        DefaultMQProducer producer;
        String ak = rocketMQProperties.getProducer().getAccessKey();
        String sk = rocketMQProperties.getProducer().getSecretKey();
        if (!StringUtils.isEmpty(ak) && !StringUtils.isEmpty(sk)) {
            producer = new DefaultMQProducer(groupName, new AclClientRPCHook(new SessionCredentials(ak, sk)),
                rocketMQProperties.getProducer().isEnableMsgTrace(),
                rocketMQProperties.getProducer().getCustomizedTraceTopic());
            producer.setVipChannelEnabled(false);
        } else {
            producer = new DefaultMQProducer(groupName, rocketMQProperties.getProducer().isEnableMsgTrace(),
                rocketMQProperties.getProducer().getCustomizedTraceTopic());
        }

        producer.setNamesrvAddr(nameServer);
        producer.setSendMsgTimeout(producerConfig.getSendMessageTimeout());
        producer.setRetryTimesWhenSendFailed(producerConfig.getRetryTimesWhenSendFailed());
        producer.setRetryTimesWhenSendAsyncFailed(producerConfig.getRetryTimesWhenSendAsyncFailed());
        producer.setMaxMessageSize(producerConfig.getMaxMessageSize());
        producer.setCompressMsgBodyOverHowmuch(producerConfig.getCompressMessageBodyThreshold());
        producer.setRetryAnotherBrokerWhenNotStoreOK(producerConfig.isRetryNextServer());

        return producer;
    }

从报错信息发现可能是nameSever不匹配name-server导致,对应类中是@ConditionalOnProperty(prefix = “rocketmq”, value = “name-server”)这个注解

下面列一下@ConditionalOnProperty注解参数的意思

  • prefix application.properties配置的前缀
  • name 属性是从application.properties配置文件中读取属性值

所以猜测配置文件要修改成对应的参数才行

将application中的配置改为

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

改完后启动再次报错

Description:

An attempt was made to call the method org.apache.rocketmq.client.producer.DefaultMQProducer.<init>(Ljava/lang/String;ZLjava/lang/String;)V but it does not exist. Its class, org.apache.rocketmq.client.producer.DefaultMQProducer, is available from the following locations:

    jar:file:/D:/maven/yycg_repository/org/apache/rocketmq/rocketmq-client/4.3.2/rocketmq-client-4.3.2.jar!/org/apache/rocketmq/client/producer/DefaultMQProducer.class

It was loaded from the following location:

    file:/D:/maven/yycg_repository/org/apache/rocketmq/rocketmq-client/4.3.2/rocketmq-client-4.3.2.jar

这次的报错是版本冲突问题,经过我无数次的实验(流泪),最终将RocketMQ-client使用的版本是4.3.2改为4.4.0解决

<dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.4.0</version>
        </dependency>

然后启动项目,没有报错,完美解决

这次这个问题费了我很多时间,记录一下。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java.try catch finally 的执行顺序说明

    Java.try catch finally 的执行顺序说明

    这篇文章主要介绍了Java.try catch finally 的执行顺序说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java实现简单文件过滤器功能

    Java实现简单文件过滤器功能

    下面小编就为大家分享一篇Java实现简单文件过滤器功能,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Java中DecimalFormat用法及符号含义

    Java中DecimalFormat用法及符号含义

    DecimalFormat是NumberFormat的一个具体子类,用于格式化十进制数字。这篇文章介绍了DecimalFormat的用法及符号含义,需要的朋友可以收藏下,方便下次浏览观看
    2021-12-12
  • Java中的对象、类、抽象类、接口、继承之间的联系

    Java中的对象、类、抽象类、接口、继承之间的联系

    这篇文章主要介绍了Java中的对象、类、抽象类、接口、继承之间的联系,文章讲解的很清晰,有不太懂的同学可以多研究下
    2021-02-02
  • Java项目开启远程调试的方法步骤(tomcat、springboot)

    Java项目开启远程调试的方法步骤(tomcat、springboot)

    这篇文章主要介绍了Java项目开启远程调试的方法步骤(tomcat、springboot),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 这一次搞懂Spring事务注解的解析方式

    这一次搞懂Spring事务注解的解析方式

    这篇文章主要介绍了这一次搞懂Spring事务注解的解析方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 浅谈Java BitSet使用场景和代码示例

    浅谈Java BitSet使用场景和代码示例

    这篇文章主要介绍了浅谈Java BitSet使用场景和代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Spring框架概述和翻转权限控制方式

    Spring框架概述和翻转权限控制方式

    Spring是Java企业级开发的核心框架,通过IOC和AOP解耦对象依赖,统一生命周期管理,支持分层注解(@Service/@Repository等),覆盖中大型项目全场景,成为标准化生态基石
    2025-08-08
  • 你知道怎么从Python角度学习Java基础

    你知道怎么从Python角度学习Java基础

    这篇文章主要为大家详细介绍了Python角度学习Java基础的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 基于sharding-jdbc的使用限制

    基于sharding-jdbc的使用限制

    这篇文章主要介绍了sharding-jdbc的使用限制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论