记录使用rocketmq-spring-boot-starter整合sping-boot与rocketmq,遇到的一些问题
    使用版本:2.1.0
    maven依赖:

<dependency>
  <groupId>org.apache.rocketmq</groupId>
  <artifactId>rocketmq-spring-boot-starter</artifactId>
  <version>2.1.0</version>
</dependency>

    具体使用方式就不详细介绍了,参考官方说明即可
    官方文档地址:https://github.com/apache/rocketmq-spring/wiki/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C

    这边记录两个文档中发送消息API中未详细说明的两个问题

1. 如何指定tag?
2. 如何指定key?

    研究过程:
    使用过rocketmq-client的应该知道,原始Message构造方法中支持指定tag及key

public Message(String topic, String tags, String keys, byte[] body) {
    this(topic, tags, keys, 0, body, true);
}

    但是在使用rocketmq-spring-boot-starter时,发送消息时有很多种方法:
    异步的asyncSend:

public void asyncSend(String destination, Object payload, SendCallback sendCallback) {
    this.asyncSend(destination, payload, sendCallback, (long)this.producer.getSendMsgTimeout());
}

    同步的syncSend:

public SendResult syncSend(String destination, Object payload) {
    return this.syncSend(destination, payload, (long)this.producer.getSendMsgTimeout());
}

    以上两种只是举例,还有支持各种形参的方法,然而都没有显式的提供tag的参数,调试跟下去,无论哪种发送方法最终都需要将消息包装成rocketmq的Message,查看调用链到RocketMQUtil的getAndWrapMessage方法中,原来rocketmq-spring-boot-starter提供的发送方法将topic与tag合并成了一个参数,在程序中进行解析包装,见下图:
在这里插入图片描述
    其实在源码的注释中也可以看出来这一点(ps: 源码注释真重要,一句话搞定所有疑惑),参数destination的格式:topicName:tags
在这里插入图片描述
    在线源码:https://github.com/apache/rocketmq-spring/blob/master/rocketmq-spring-boot/src/main/java/org/apache/rocketmq/spring/core/RocketMQTemplate.java

    至于另一个问题,如何设置key的值,经过上面的调试过程,很容易看到在RocketMQUtil的getAndWrapMessage方法中也有设置key的相关操作:
在这里插入图片描述
    一层层返回跟上去便可以看到这个headers参数是org.springframework.messaging.Message中设置的,在发送消息的刚好有可以传入的对应类型参数,于是在构造参数时添加对应值即可。

    最后,解决方案参考:

Message message = MessageBuilder.withPayload(dataList).setHeader("KEYS", IdUtil.simpleUUID()).build();
SendResult result = rocketMQTemplate.syncSend(topic + ":080", message);
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐