最近遇到一个问题,本地环境和测试环境共用了同一套kafka,本地启动的时候会消费kafka消息.
这就导致了一个问题.
比如在一个团队里,同时并行了两个迭代,A迭代在分支A1对消费某个topic的逻辑进行调整,发布到了测试环境进行测试,但是B迭代的分支B1没有修改这个topic的逻辑,用的还是旧的逻辑,这时候B迭代的开发人员本地启动的服务,就有可能会消费掉这个topic的消息.并且走的就是旧逻辑,这时候A迭代的开发人员就会纳闷,为什么自己的代码没有生效,对着代码一顿分析。。。分析半天发现是被别的同事的本地服务给消费了。。。。
这个问题在团队开发中经常会发生,正对上述问题,进行研究,在网上搜索都是需要改代码或者配置的,但是在正式项目上肯定是不能随便改代码或者是配置的,于是把这些方案都抛弃了,最终我研究出了一种解决方法,这种方案无需修改任何代码和配置,安全无风险。
先说下大概的原理:
kafka的AbstractMessageListenerContainer类的start方法是用于启动监听器,开始消费消息的一个方法,这个start方法会通过一个标识来判断是否执行,我们可以通过控制这个标识来控制是否执行这个start方法,那么怎么控制这个标识呢,通过debug调试模式启动服务后,通过执行调试代码的方式改变这个状态。
下面附上详细步骤:
1.打开AbstractMessageListenerContainer类
2.找到start方法
这里isRunning()方法实际是通过running属性判断是否执行doStart()方法,所以在这里打个断点,修改一下running这个属性的值就可以了。
3.打断点,修改 running这个属性的状态,设置成true就不会执行doStart()方法
这里要注意不要勾选suspend,这样走到这个断点的时候就不会停在这这会继续往下走,
勾选evaluate and log然后在文本框内写入你要执行的语句,this.setRunning(true)就是把running属性设置成了true,这样子我们的服务就不会启动消费线程了,也就是不会消费消息了。
总结: 原理很简单,就是在kafka启动消费线程前,通过执行调试代码的方式,改变Container状态,让它不再执行(启动消费线程)
举一反三其他类似的场景也可以这样操作。