zoukankan      html  css  js  c++  java
  • RocketMQ同一个消费者唯一Topic多个tag踩坑经历

    最近做的项目的一个版本需求中,需要用到MQ,对数据记录进行异步落库,这样可以减轻数据库的压力,同时可以抗住大量的数据落库。这里需要说明一下本人用到的MQ是公司自己在阿里的RokectMQ的基础上进行封装的,然后加上自己的东西,形成个性化的开发,且安全性高。这里就不多透露相关公司的信息啦,我就叫它MQ。

           由于刚刚从事JAVA开发这个行业不久,所以在使用到这个MQ的时候本人还是比较陌生的,于是花了一些时间去学习,当然学习的时候能记住的东西还是不多的,因为在学习理论的时候,没有真正的去实践,效果不是很明显,就这样学的也是云里雾里。对公司的MQ有了最基本的了解之后,就开始动手撸代码了,在这个需求中引入了公司的MQ依赖jar包,然后在开发环境中配置好相关的MQ信息,写了一个消费MQ的类,当然发消息的代码还是很好写的。

    MQ生产者的核心代码:

    @Autowired
     
    private MqsTemplate mqsTemplate ;
     
    public void sendMqs(String key, ContentDto dto){
     
    String content = JSON.toJSONString(dto);
     
    mqsTemplate.sendMessage(content, topic, tag, key);
     
    }

    MQ消费者的核心代码:

    BaseConsumer.java
     
    public abstract class BaseConsumer implements MqsListener<String>{
     
    @Autowired
     
    private TestMapperOne testMapperOne;
     
    @Autowired
     
    private TestMapperTwo testMapperTwo;
     
    @Override
     
    public void onMessage(String topic, String tag, String key, String message){
     
    log.info("topic {} tag {} key {}", topic, tag, key);
     
    try{
     
    this.consumer(key, message, tag);
     
    }catch(Exception e){
     
    log.error(String.format("topic %s tag %s key %s message %s), topic, tag, key, message), e);
    }
    }
    protected abstract void consumer(String key, String message, String tag);
    }
    TestConsumer.java
    @Service
    @MqsMessageListener(consumerId = "${自己去MQ的页面去新增就行}"//最开始的写法(错误的写法)
    topicTags = ("${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG01};" +
    "${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG02}")
    //在这里对于同一个topic,使用“ ; ”分割是不当的,分号分割是指多个topicTags的topic是不同的,如果这里这样分割的话,
    消息发送到MQ去,可以发现消息确实是发送到了MQ,但是没有被消费者消费,这也就是我遇到的坑了,由于开年刚来上班,公司的众
    位大佬还没来上班,能问的人又很少,于是自己琢磨了一上午。
    最终发现,原来是由于我在同一个项目的同一个类上的唯一topic对应了不同的tag,在MQ的页面可以清晰的看到,后面的tag覆盖了前面的tag,
    显然这样是不合理的。 经过查阅资料发现,同一个类上的唯一topic对应不同的tag写法如下 正确写法: topicTags
    = ("${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG01}||" + "${haha.mq.topic:TEST_TAG02}") ) 在同一个类中(也就是一个消费者中),同一个topic对应不同的tag,应该使用 “ || ”进行分割,使用""或“*”订阅所有tag。 public class TestConsumer extends BaseConsumer { //此处代码就不写了,主要就是根据不同的tag,然后把对应的数据请求持久层的接口,进行落库,当然这里我是为了省事,才踩到这样的坑,
    其实针对不同的情况,就算是使用同一个topic订阅,分成两个类去写就ok了,在MQ中再新增一个消费者,这样在同一个项目的不同消费者类中,
    一个topic对应一个tag。就算它们两个的topic是一样的都是没关系的,而且这样别人看起你的代码来,也是非常直观的,层次分明。
    }

    PS:这里补充一下

    @MqsMessageListener 是消费者监听注解,用于发现消费者,以及属性包括消费所有单一功能的注解,作用在类上面。

    以上就是踩到的RocketMQ的坑,由于开发经验有限,技术粗糙,上文的描述可能不是太清晰,可能会出现误点或者错误的地方,望大家给予建议,我加以改进,共同进步!

    觉得此文不错的,点赞转发,本人非常感谢!

  • 相关阅读:
    DNNClassifier 深度神经网络 分类器
    浏览器对MP4视频 帧宽度 高度的兼容性
    UnicodeEncodeError:'latin-1' codec can't encode character
    文件夹下 文件计数
    the largest value you actually can transmit between the client and server is determined by the amount of available memory and the size of the communications buffers.
    the “identity” of an object
    广告特征 用户特征
    如果一个维度全覆盖,则有效维度应该对该维度全覆盖
    a high-level neural networks AP
    使用 LDA 挖掘的用户喜好主题
  • 原文地址:https://www.cnblogs.com/lu97/p/14444378.html
Copyright © 2011-2022 走看看