解决rocketmq-client查询手动发送消息异常问题

 更新时间:2023年08月29日 15:26:27   作者:小淼同学  
这篇文章主要介绍了解决rocketmq-client查询手动发送消息异常问题,具有很好的参考价值,希望对大家大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

rocketmq-client查询手动发送消息异常

今天处理rocketmq的后台的一些问题

下面这个问题是你也用网上4.x的rocketmq版本的监控后台,才会出现的

MQClientException: CODE: 208 DESC: query message by id finished, but no message.

这个是我们用rocketmq-client手动发送消息的时候,再去查看消息详情的时候遇到的问题,会报错,消息找不到

这是由于查询出来的mq消息,这些消息的msgId,不是真的msgId,而是UniqueKey

为什么会这样呢,我们来看一段源码

public static List<MessageExt> decodes(java.nio.ByteBuffer byteBuffer, final boolean readBody) {
        List<MessageExt> msgExts = new ArrayList<MessageExt>();
        while (byteBuffer.hasRemaining()) {
            MessageExt msgExt = clientDecode(byteBuffer, readBody);
            if (null != msgExt) {
                msgExts.add(msgExt);
            } else {
                break;
            }
        }
        return msgExts;
    }

1.以上是解析从broker获取到的消息

  public static MessageExt clientDecode(java.nio.ByteBuffer byteBuffer, final boolean readBody) {
        return decode(byteBuffer, readBody, true, true);
    }

2.注意第四个参数是true

它代表是否是client端,就是监控端

 public static MessageExt decode(
        java.nio.ByteBuffer byteBuffer, final boolean readBody, final boolean deCompressBody, final boolean isClient) {
        try {
            MessageExt msgExt;
            //1.重点看这里
            if (isClient) {
                msgExt = new MessageClientExt();
            } else {
                msgExt = new MessageExt();
            }
            //此处省略
            ...........
            ByteBuffer byteBufferMsgId = ByteBuffer.allocate(MSG_ID_LENGTH);
            String msgId = createMessageId(byteBufferMsgId, msgExt.getStoreHostBytes(), msgExt.getCommitLogOffset());
            msgExt.setMsgId(msgId);
            //2.重点看这里
            if (isClient) {
                ((MessageClientExt) msgExt).setOffsetMsgId(msgId);
            }
            return msgExt;
        } catch (Exception e) {
            byteBuffer.position(byteBuffer.limit());
        }
        return null;
    }

3.MessageClientExt主要是这个对象惹的祸

老的版本mq就是一个 MessageExt

我们再来看看这个对象为什么惹祸了

public class MessageClientExt extends MessageExt {
    public String getOffsetMsgId() {
        return super.getMsgId();
    }
    public void setOffsetMsgId(String offsetMsgId) {
        super.setMsgId(offsetMsgId);
    }
    /**
    * 没错就是这里,默认拿的是属性里的UNIQ_KEY
    **/
    @Override
    public String getMsgId() {
        String uniqID = MessageClientIDSetter.getUniqID(this);
        if (uniqID == null) {
            return this.getOffsetMsgId();
        } else {
            return uniqID;
        }
    }
    public void setMsgId(String msgId) {
        //DO NOTHING
        //MessageClientIDSetter.setUniqID(this);
    }
}

所以知道了问题,就好解决了

我是在显示类里面做相应的处理,贴下我的处理方式,我是在  MessageView.class里处理

 public static MessageView fromMessageExt(MessageExt messageExt) {
        MessageView messageView = new MessageView();
        BeanUtils.copyProperties(messageExt, messageView);
        if (messageExt.getBody() != null) {
            messageView.setMessageBody(new String(messageExt.getBody(), Charsets.UTF_8));
        }
        //主要是这里判断下,是否是这个类,是就把原来的msgId拿出来
        if(messageExt instanceof MessageClientExt){
            MessageClientExt ext =   (MessageClientExt) messageExt;
            messageView.setMsgId(ext.getOffsetMsgId());
        }
        return messageView;
    }

总结

好了,这里就总结下这个问题

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

相关文章

  • 解决spring jpa中update的坑

    解决spring jpa中update的坑

    这篇文章主要介绍了spring jpa中update遇到的坑及解决方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring事务失效的问题及解决方案

    Spring事务失效的问题及解决方案

    本文详细分析了Spring事务失效的原因,并提供了一个解决方案,在代码中,事务传播属性设置为REQUIRES_NEW解决了事务失效的问题,确保了日志记录的操作不会影响主事务的回滚,同时,文中还总结了各种事务传播属性的含义和使用场景
    2025-11-11
  • Mybatis中的mapper模糊查询语句LIKE

    Mybatis中的mapper模糊查询语句LIKE

    这篇文章主要介绍了Mybatis中的mapper模糊查询语句LIKE,具有很好的参考价值,希望对大家有所帮助。
    2021-12-12
  • Java设计模式中的简单工厂模式解析

    Java设计模式中的简单工厂模式解析

    这篇文章主要介绍了Java设计模式中的简单工厂模式解析,简单工厂模式提供一个创建对象实例的功能,而无须关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类,需要的朋友可以参考下
    2023-11-11
  • JPA CriteriaBuilder子查询方式

    JPA CriteriaBuilder子查询方式

    这篇文章主要介绍了JPA CriteriaBuilder子查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

    dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

    这篇文章主要介绍了dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Boot 整合 RocketMQ 的全流程(消息发送、消费、重试)

    Spring Boot 整合 RocketMQ 的全流程(消息发送、消费、重试)

    本文详细介绍了 Spring Boot 整合 RocketMQ 的全流程,包括环境搭建、依赖配置、消息发送(同步 / 异步 / 单向)、消息消费(集群 / 广播、并发 / 顺序)、消息重试与死信队列处理,并提供了完整的代码示例,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Java中JFrame实现无边框无标题方法

    Java中JFrame实现无边框无标题方法

    这篇文章主要介绍了Java中JFrame实现无边框无标题方法,本文直接给出代码实例,需要的朋友可以参考下
    2015-05-05
  • java 11新特性HttpClient主要组件及发送请求示例详解

    java 11新特性HttpClient主要组件及发送请求示例详解

    这篇文章主要为大家介绍了java 11新特性HttpClient主要组件及发送请求示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 深入浅析JDK8新特性之Lambda表达式

    深入浅析JDK8新特性之Lambda表达式

    Lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。这篇文章主要介绍了JDK8新特性之Lambda表达式,非常不错感兴趣的朋友参考下吧
    2016-10-10

最新评论