网站首页 > 博客文章 正文
最近做的项目的一个版本需求中,需要用到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的坑,由于开发经验有限,技术粗糙,上文的描述可能不是太清晰,可能会出现误点或者错误的地方,望大家给予建议,我加以改进,共同进步!
觉得此文不错的,点赞转发,本人非常感谢!
猜你喜欢
- 2024-12-12 RocketMQ——RocketMQ搭建及问题解决
- 2024-12-12 腾讯云微服务正式发布RocketMQ Serverless版本
- 2024-12-12 3分钟白话RocketMQ系列—— 核心概念
- 2024-12-12 RocketMQ如何避免未来再次发生积压
- 2024-12-12 rocketmq延迟消息实现原理(上)
- 2024-12-12 RocketMQ跨队列的顺序消费
- 2024-12-12 Kafka、RabbitMQ、RocketMQ、ActiveMQ 等多个分布式消息队列比较
- 2024-12-12 应如何在 Spring Boot 中使用 RocketMQ 实现批量消息消费?
- 2024-12-12 RocketMQ 5.0 多语言客户端的设计与实现
- 2024-12-12 从基础到进阶,一文详解RocketMQ事务消息,看完不会跪键盘
你 发表评论:
欢迎- 最近发表
-
- 比GoPro 13更强的大疆Action 5 Pro,到底强在哪里?
- 信号和槽(信号和槽的实现原理)
- 在响应式项目中连接设计与开发(请简述实现响应式设计包括哪些技术点)
- 【C#】委托、Action、Func 和 Event 之间的关系
- 如何使用JavaScript实现Prompt弹窗?
- 谷歌Magic Actions功能曝光:AI革新安卓16通知交互
- 基于目标TPS的性能测试,如何通过手动设置场景进行测试?
- IOS基础学习之输出口和动作(io口输入输出实验总结及体会)
- 《Java语言程序设计》期末考试模拟试题——判断题和问答题
- Android学习之Touch事件的处理(android触摸事件实例)
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)