其他分享
首页 > 其他分享> > rocketmq升级记录

rocketmq升级记录

作者:互联网

       由于服务器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的实现,则客户端升级后就可以了。

 

标签:4.7,记录,spring,4.9,升级,org,import,rocketmq
来源: https://www.cnblogs.com/thinkingandworkinghard/p/16595041.html