开始之前,猿Why先抛出一系列问题:
- RocketMQ的Topic创建有几种方式?
- RocketMQ服务没有指定的Topic情况下(某种业务场景),是由业务流程发起者来创建Topic还是RocketMQ运维人员创建合适?
- Producer和Consumer在执行start方法之后,是否会创建Topic到Broker?
如果有路过的大佬,希望不利赐教!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
然后我来描述一下我遇到的问题:producer和consumer,start后,尚未进行消息的生产和消费,进行Topic状态检查,没有返回Topic的存在。基于这样的场景(先不管是RocketMQ就是这种机制,还是服务配置不对,毕竟是线上无法去考究),我想在业务代码中做一个兜底操作:当Topic不存在的时候,自主createTopic。
还是那句老话儿,自己在开发中遇到的问题,前辈们一定也遇到过!
为了达到自己的目的,那么?上代码:
加依赖(请根据自己的RocketMQ服务选择版本):
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-tools</artifactId>
<version>4.3.0</version>
</dependency>
@RunWith(SpringRunner.class)
@SpringBootTest
public class RocketMQToolsTest {
private static Logger logger = LogManager.getLogger(RocketMQToolsTest.class);
@Test
public void createTopicTest() {
DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt();
defaultMQAdminExt.setAdminExtGroup(Const.GROUP);
defaultMQAdminExt.setNamesrvAddr(Const.NAME_SRV);
try {
defaultMQAdminExt.start();
String newTopic = defaultMQAdminExt.getAdminExtGroup();
String brokerName = "rocketmq";
defaultMQAdminExt.createTopic(brokerName, newTopic, 1);
// 稍等片刻
Thread.sleep(3000);
TopicStatsTable topicStatsTable = defaultMQAdminExt.examineTopicStats(newTopic);
Assert.isTrue(!ObjectUtils.isEmpty(topicStatsTable), "Topic不存在");
logger.info(JSON.toJSON(topicStatsTable));
} catch (MQClientException e) {
logger.error(e.getErrorMessage());
} catch (InterruptedException e) {
Thread.currentThread().interrupted();
logger.error(e.getMessage());
} catch (RemotingException e) {
logger.error(e.getMessage());
} catch (MQBrokerException e) {
logger.error(e.getErrorMessage());
} finally {
defaultMQAdminExt.shutdown();
}
}
}
备注:defaultMQAdminExt.createTopic(brokerName, newTopic, 1);
brokerName就是下图圈中的内容
下图可能可以回答开篇的问题1(也是为什么可以使用前边例子中的方式创建Topic)