将开源RocketMQ的Producer下线后重新启用的操作

本文探讨了在阿里云RocketMQ中,如何进行Producer的下线与重启操作,遇到的问题包括Producer不可重复使用、状态获取困难和NameServer获取不完整。作者分享了解决这些问题的方法和背后原因分析。
摘要由CSDN通过智能技术生成

由于平台应用场景的需要,允许将启动好的开源版本的RocketMQ的Producer执行下线、上线等操作,下线操作简单,调用其shutdown()可以方便的完成,但是上线这个操作着实费了点力气,主要发现以下几个问题:

1、关闭后的Producer不可以再次启用

执行了下线操作即执行了shutdown()方法的Producer,该Producer的状态变会为SHUTDOWN_ALREADY,是不允许再次上线的,当直接对该Producer执行start()方法时,就会报状态错误,也就是同一个Producer下线后就没有办法再次使用了,要想重启该Producer只能够新建立一个Producer,方法实现如下:

阿里云RocketMQ提供的Producer包装实现类ProducerBean,提供了支持重新启用该Producer的逻辑:

不过其真实的实现逻辑,和开源的版本是一样的,都是根据该Producer的属性重新创建Producer并启动,方法实现如下:

为什么就不能够支持到针对原Producer直接重新启用呢?

 2、获取Producer的启动状态不易

RocketMQ的Producer包装实现类org.apache.rocketmq.client.producer.DefaultMQProducer,本身没有提供获取当前Producer状态的方法,可以通过DefaultMQProducer类内部的真实实现类DefaultMQProducerImpl中提供的getServiceState()方法获取,不过该操作已经被设置为了Deprocated了:

说不定在以后的某个版本就不可以直接使用了,到时就只能够通过反射的方式获取DefaultMQProducerImpl中字段serviceState的值来判断Producer的状态。

3、获取Producer中原来完整的NameServer不易

DefaultMQProducer中提供了一个获取NameServer的方法mqProducer.getNamesrvAddr(),但是这个方法返回的NameServer不是一个完整的NameServer,返回的是去掉协议头的NameServer,如原来的NameServer是http://127.0.0.1:9876,该方法返回的是127.0.0.1:9876,方法实现如下:

但是我就是需要完整的NameServer地址,需要用来判断该NameServer的Producer是否已经启动了,需要服务于多场景,没有办法就只有通过反射的方式获取真实的NameServer地址了,方法实现如下:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值