最近作的项目的一个版本需求中,须要用到MQ,对数据记录进行异步落库,这样能够减轻数据库的压力,同时能够抗住大量的数据落库。这里须要说明一下本人用到的MQ是公司本身在阿里的RokectMQ的基础上进行封装的,而后加上本身的东西,造成个性化的开发,且安全性高。这里就很少透露相关公司的信息啦,我就叫它MQ。java
因为刚刚从事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消费者的核心代码:app
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 是消费者监听注解,用于发现消费者,以及属性包括消费全部单一功能的注解,做用在类上面。ide
以上就是踩到的RocketMQ的坑,因为开发经验有限,技术粗糙,上文的描述可能不是太清晰,可能会出现误点或者错误的地方,望你们给予建议,我加以改进,共同进步!学习
以为此文不错的,点赞转发,本人很是感谢!this