首页
学习
活动
专区
圈层
工具
发布

给Apache RocketMQ提了个bug

超级开心给Apache RocketMQ提了个PR,采纳了

1.起因和疑问goutou

因公司需要,在rocketmq的官方文档上学下rocketmq,我在看官方提供的异步发送demo的时候有了个小疑问,demo如下

rocketmq异步发送demo

关于CountDownLauch的原理可以看看我之前的文章CountDownLauch解析,其实就是一个带阻塞功能的计数器。这里Apache RocketMQ又提供了一个coutdownlatch2,我看了代码,大致是为了设置一个等待时间又封装了下。

那么看到这里的demo,就有浓浓的疑问了,这里结合coutdownlatch和for循环,我猜测他的意思是基于这样一个场景的需要

我们想发100个消息,然后不管成功或者失败一定要发到mq上,但是由于这里是异步消息。因此我们直接for循环执行的话,仅仅是组装消息,遍历结束,但是消息打不打的到mq上还是未知的,后面又有个shutdownI()方法,如果不阻塞的话,很可能我们for里消息还没执行完呢,咱们实例直接没了。因此我觉得这里引用countdownlatch来阻塞主线程,直到全部消息打到mq后(不管成功或者失败,只要到发了就行),我们要立即释放主线程。

那么我觉得的那场景需要,但是这里代码不满足这个需要啊,两者一碰撞我的问题就来了:

1.这里弄了计数器却没有减操作是什么个意思?

2.这里用计数器阻塞了主线程5秒但是跟消息发没发完没直接联系啊,我搞10W消息,难道你就估他大概一分钟执行完设置60秒?如果只想起睡眠作用那为啥不用 TimeUnit.SECONDS.sleep(5);代替呢?

解决问题

先实践下果然达不到预期,我就先去提了个issues

本身作为工作还不到一年的毕业生对提pr这事有点不好意思,感觉人家大佬写的代码让我小兵子质疑不太好。就把这事忘了好几天,今天竟然又收到了Apahe让提pr的邮件我才想起来,然后down了代码提了一个pr给Apache。

他们效率极高,提了pr当晚就给修复了,很**感谢Apache RocketMQ团队的大佬们,让我感觉技术圈真的很open!**

举报
领券