解决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>然后启动项目,没有报错,完美解决
这次这个问题费了我很多时间,记录一下。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
