RocketMQ源码分析之从官方示例窥探RocketMQ事务消息实现基本思想

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正文

综上所述,服务端发送了10条消息,但我们从rocketmq-consonse上只能查看到3条消息,一个合理的解释就是只有3条消息提交,其他都回滚了,如图所示:

这里写图片描述

实例代码分析:

public class TransactionProducer {

public static void main(String[] args) throws MQClientException, InterruptedException {

TransactionListener transactionListener = new TransactionListenerImpl(); // @1

TransactionMQProducer producer = new TransactionMQProducer(“please_rename_unique_group_name”);

producer.setNamesrvAddr(“127.0.0.1:9876”);

ExecutorService executorService = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS, new ArrayBlockingQueue(2000), new ThreadFactory() {

@Override

public Thread newThread(Runnable r) {

Thread thread = new Thread®;

thread.setName(“client-transaction-msg-check-thread”);

return thread;

}

}); // @2

producer.setExecutorService(executorService); // @3

producer.setTransactionListener(transactionListener); // @4

producer.start();

String[] tags = new String[] {“TagA”, “TagB”, “TagC”, “TagD”, “TagE”};

for (int i = 0; i < 10; i++) { // @5

try {

Message msg =

new Message(“transaction_topic_test”, tags[i % tags.length], “KEY” + i,

("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));

SendResult sendResult = producer.sendMessageInTransaction(msg, null);

System.out.printf(“%s%n”, sendResult);

Thread.sleep(10);

} catch (MQClientException | UnsupportedEncodingException e) {

e.printStackTrace();

}

}

for (int i = 0; i < 100000; i++) { //这里只是阻止生产者过早退出,导致事务消息的相关机制无法运行

Thread.sleep(1000);

}

producer.shutdown();

}

}

代码@1:创建TransactionListener 实例,字面理解为事务消息事件监听器,下文详细对其进行展开。

代码@2:ExecutorService executorService,创建一个线程池,其线程的名称前缀”client-transaction-msg-check-thread“,从字面理解为客户端事务消息状态检测线程,我们可以大胆的猜测一下是不是这个线程池调用TransactionListener方法,完成对事务消息的检测呢?【这里只是作者的猜测,大家不能当真,在作者后续文章发布后,如果该观点错误,会加以修复,这里写出来,主要是想分享一下我读源码的方法】。

代码@3:为事务消息发送者设置线程池。

代码@4:为事务消息发送者设置事务监听器。

代码@5:发送10条消息。

接着,我们再来看一下TransactionListener 的实现:

TransactionListenerImpl

public class TransactionListenerImpl implements TransactionListener {

private AtomicInteger transactionIndex = new AtomicInteger(0);

private ConcurrentHashMap<String, Integer> localTrans = new ConcurrentHashMap<>();

@Override

public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {

int value = transactionIndex.getAndIncrement();

int status = value % 3;

localTrans.put(msg.getTransactionId(), status);

return LocalTransactionState.UNKNOW;

}

@Override

public LocalTransactionState checkLocalTransaction(MessageExt msg) {

Integer status = localTrans.get(msg.getTransactionId());

if (null != status) {

switch (status) {

case 0:

return LocalTransactionState.UNKNOW;

结尾

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。

由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
[外链图片转存中…(img-2UoCucDe-1713646638838)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值