rocketMQ中事务发送消息

news/2024/10/14 17:53:10

rocketMQ中有关事务的发送消息方式,写的一个demo

1、在MyProducer类中的方法,即先定义调用

@Component
public class MyProducer {@Autowiredprivate RocketMQTemplate template;
public void sendTractionMessage(String topic, String msg) throws InterruptedException {String[] tags = new String[]{"TagA","TagB","TagC","TagD","TagE"};   //这里的tag是标签,具体使用的时候,可以自行根据规则赋值,可以是订单编号for (int i = 0; i < 10; i++) {     //这个10也是demo时候用的,实际使用可以根据具体需求Message<String> message = MessageBuilder.withPayload(msg).build();String destination = topic + ":" + tags[i % tags.length];  //这里是取模TransactionSendResult transactionSendResult = template.sendMessageInTransaction(destination, message, destination);System.out.println("transactionSendResult = " + transactionSendResult);}}}

2、监听MyTransactionListener这个类作用是对不同tag的处理方式

@RocketMQTransactionListener(rocketMQTemplateBeanName = "rocketMQTemplate")  //使用rocketMQTemplate
public class MyTransactionListener implements RocketMQLocalTransactionListener {  //需要实现该类@Overridepublic RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object o) {String destination = (String) o;org.apache.rocketmq.common.message.Message message = RocketMQUtil.convertToRocketMessage(new StringMessageConverter(),String.valueOf(StandardCharsets.UTF_8),destination,msg);String tags = message.getTags();if (StringUtils.contains(tags,"TagA")){   //对于不同的tag标签,返回不同的状态,rocketMQ会根据状态来决定两阶段提交的第二阶段决定消息是提交还是放弃return RocketMQLocalTransactionState.COMMIT;}else if (StringUtils.contains(tags,"TagB")){return RocketMQLocalTransactionState.ROLLBACK;}else {return RocketMQLocalTransactionState.UNKNOWN;}}@Overridepublic RocketMQLocalTransactionState checkLocalTransaction(Message message) {return null;}
}

3、使用测试类测试

    @Testvoid testSendTransactionMessage() throws InterruptedException {String topic = "my-boot-topic";String message = "hello rocket mq transaction springboot message";myProducer.sendTractionMessage(topic,message);System.out.println("事务消息发送成功~");}

4、消费端消费情况,demo中循环是10,但只有2条被消费者接收处理,就是那TagA的两条数据,因为他们的状态是commit

 5、rocketMQ的事务分两阶段提交,第一阶段是发送broker一个half消息,而只有等本地事务处理完成,才能再告诉broker是commit还是rockback,最终保证原子性

 

以上内容纯属学习使用!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

为什么线下面试越来越流行了?

不知道大家有没有发现,最近在找工作时,越来越多的公司开始要求必须线下面试了,例如,深信服:例如,华为:还有公司在发布招聘信息时也明确写明了“只能线下面试”:那背后的原因究竟是啥呢? 原因一:作弊成本越来越低 AI 的诞生确实提供了很多便利,但也有人和团队利用 AI…

罗技键鼠在使用Synergy中的灵敏度问题

罗技键鼠在使用Synergy中的灵敏度问题 设备清单mac电脑一台(作为主控端) windows电脑一台(作为被控端) logi master系列键鼠一套遇到的问题 Synergu已经正常启用。mac作为主控设备,且关闭了logi flow情况下,在windows(被控端)使用鼠标明显慢很多,原因是罗技鼠标在mac上…

HDLBits 练习题:8位移位寄存器

HDLBits 练习题:8 位移位寄存器 原题 This exercise is an extension of module_shift. Instead of module ports being only single pins, we now have modules with vectors as ports, to which you will attach wire vectors instead of plain wires. Like everywhere else…

IntelliJ IDEA 2024激活码(亲测有效,仅供学习和交流)

资源是从官网购买,仅供学习和交流 激活码链接地址

任务类型和字段自定义,支撑个性化业务管理

一句话介绍 任务类型和任务字段自定义,面向企业内部不同业务部门,在管理各自任务的时候有不同信息管理差异的场景。企业根据自己的任务管理需求,自定义任务类型,配置不同的任务字段,解决差异化的任务管理场景。 应用场景某互联网企业,企业内部有研发部,有销售部 研发部通…

解决Scaffold-DbContext Build failed的问题

以前使用Entity Framework时,Visual Studio直接提供了相应的功能可以从数据库生成数据实体。现在升级到Entity Framework Core后,无法再使用Visual Studio来生成数据实体了,需要调用 Scaffold-DbContext 命令。先简单介绍一下如何使用Scaffold-DbContext为数据库生成实体类型…

Squid代理服务器搭建和简单使用

1 Squid的介绍 1.1 前言简介 代理服务器(Proxy Server)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。 [1] 代理服务器作为连接Internet与Intranet的…

win电脑快速关机的另类方法

1、在桌面上新建一个快捷方式 2、填写对应参数目标:%windir%\System32\SlideToShutDown.exe 起始位置:%windir%\System32 快捷键按自己喜好来,我这里输入:%windir%\System32 如下图所示:接下来按双击或者使用自己的快捷键就可以实现关机啦Love for Ever Day