【RocketMQ系列】-开发人员自主createTopic

开始之前,猿Why先抛出一系列问题:

  1. RocketMQ的Topic创建有几种方式?
  2. RocketMQ服务没有指定的Topic情况下(某种业务场景),是由业务流程发起者来创建Topic还是RocketMQ运维人员创建合适?
  3. 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)
在这里插入图片描述

参考资料:
RocketMQ源码
RocketMQ服务搭建
RocketMQ服务Console(控制台)


版权声明:本文为u010730731原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。