由于服务器rocketmq的版本是4.7.1,里面的fastjson是1.2.67.被安全部门告知需要升级到1.2.80以上的。于是开始rocketmq的升级之路。
看了下最新版本是 https://github.com/apache/rocketmq ,是4.9.4.处于使用考虑,使用的是4.9.2.(4.9.2 fastjson y) 于是先让运维的同事在自己的云服务器安装了下,本地修改nacos的配置。把本地的mq地址改成他安装好的云服务器集群ip,然后本地写好发送mq的例子,进行测试。
@Resource private DelaySyncProduct delaySyncProduct; @Override public Result<PublishCommentVO> putCommentTest(PublishCommentDTO commentDTO) throws Exception { try { // MQ审核发布信息 StringBuilder sb = new StringBuilder(messageTopic); sb.append(":").append(CommunityTypeTag.BBS_TYPE_COMMENT.getCode()); // 推消息 delaySyncProduct.sendDealyMessage(sb.toString(),JSONObject.toJSONString(commentDTO),5); } catch (MessagingException e) { LOG.error("异常",e); } return Result.ok(); }
package com.gwm.marketing.common.util; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * @author fanht * @descrpiton 延迟队列,使用rockemq的延迟队列 * @date 2022/6/22 09:47:41 * @versio 1.0 */ @Component @Slf4j public class DelaySyncProduct { @Autowired private RocketMQTemplate mqTemplate; /** * rocketMq延迟队列分为18个等级 每个等级对应的延迟时间如下 */ private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"; public void sendDealyMessage(String topic,String message,int delayLevel){ SendResult sendResult = mqTemplate.syncSend(topic, MessageBuilder.withPayload(message).build(),20000,delayLevel); log.info("sendtime is {}", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").format(LocalDateTime.now())); log.info("sendResult is {}",sendResult); } }
测试流程如下:先使用4.7.1的版本进行mq的发消息以及消费消息;没有问题; 然后运维把4.7.1的配置信息拷贝到4.9.2上面,将4.7.1的broker的写权限关闭,4.9.2的broker开启。4.7.1的nameServer关闭,4.9.2的nameServer开启。
然后就出问题了: 切换到4.9.2之后,之前发到4.7.1的 消息无法消费。 但是4.9.2的发消息以及消费,又都是正常的。
想了下我们这边客户端也是4.7.1的,是不是客户端的问题呢?于是把客户端4.7.1的 pom依赖修改为了4.9.2
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.9.2</version> </dependency>
继续测试,发现升级客户端后还是不行。
想到我们发mq 用的是 rocketmq-spring,里面的版本也是4.7.1.是不是这个的问题。https://github.com/apache/rocketmq-spring。 因为前几天一直在看rocketmq-spring的源码相关,知道rocketmq-spring的客户端要和服务端保持一直。而且我们这个rocketmq-spring也是1年前的版本了。想到这里,决定再试下。
然后发现rocketmq-spring 的依赖包是随着rocketmq-spring-boot-starter的。于是升级 rocketmq-sprign-boot-starter
<!-- rocketmq --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency>
为何是2.2.2,因为rocketmq-spring的每个版本都对应不同的rocketmq的版本的。
2.2.1只能对应4.9.1.
升级后继续测试,使用延迟队列。先把消息发到4.7.1上面,然后让运维关闭4.7.1的写权限,打开4.9.2来进行消费。
总算可以了!
总结下来就是:低版本rockemq升级到高版本的mq,除了服务端要升级,客户端rocketmq-client 也要升级。如果是用的中间件,则中间件也要对应的升级。如果是自己公司写的mq的实现,则客户端升级后就可以了。