Rocketmq在Java代码之中手动创建Topic
【原创,转载请注明出处】
我的 【博客园主页】 【CSDN主页】 【简书主页】
加V进Java交流群,备注Java交流:w1129574379
** 本文仅限RocketMQ 4.5.*版本,其他版本可能有区别,仅供参考 **
本文仅限单 name server 的情况,nameserver集群的情况下不确定能否正常工作(原理都是一样的)
参考信息源及相关类/方法
org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand#execute
org.apache.rocketmq.client.ClientConfig
额外的依赖
需要添加额外的maven依赖,版本自选
org.apache.rocketmq
rocketmq-tools
4.5.1
org.apache.rocketmq
rocketmq-spring-boot-starter
2.0.3
使用
在命令行中创建Topic时应使用updateTopic命令,其使用示例如下:
./mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t tx-mq-TOPIC
各参数含义如下:
mqadmin updateTopic [-b ] [-c ] [-h] [-n ] [-o ] [-p ] [-r ] [-s ]
-t [-u ] [-w ]
-b,--brokerAddr create topic to which broker
-c,--clusterName create topic to which cluster
-h,--help Print help
-n,--namesrvAddr Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
-o,--order set topic's order(true|false)
-p,--perm set topic's permission(2|4|6), intro[2:W 4:R; 6:RW]
-r,--readQueueNums set read queue nums
-s,--hasUnitSub has unit sub (true|false)
-t,--topic topic name
-u,--unit is unit topic (true|false)
-w,--writeQueueNums set write queue nums
注意事项及存在的问题:
RocketMQ规定,在使用updateTopic命令创建topic时,-b或-c选项必须指定其中一个(都指定则处理-b参数,忽略-c参数),与此同时,-t参数也为必要参数,缺少这几个必要参数则topic创建失败!!!
使用Java代码手动创建topic的形式中,使用-b选项创建topic可以正常使用,此时RocketMQ直接使用指定的broker地址来找到broker并在对应broker上创建topic。
使用Java代码手动创建topic的形式中,直接使用-c选项创建topic无法创建成功,因为org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand#execute方法需要一个DefaultMQAdminExt对象来连接到对应nameserver上以便获取对应集群下的所有broker信息,
DefaultMQAdminExt对象针对nameserver的处理代码为:private String namesrvAddr = NameServerAddressUtils.getNameServerAddresses(),查看代码发现其实际实现为System.getProperty(MixAll.NAMESRV_ADDR_PROPERTY, System.getenv(MixAll.NAMESRV_ADDR_ENV))。此时问题出现了,这里的实现代码并不能get到namesrv地址的参数值,导致连接到namesrv失败,完整报错信息如下:
点击查看完整报错信息
org.apache.rocketmq.tools.command.SubCommandException: UpdateTopicSubCommand command failed
at org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand.execute(UpdateTopicSubCommand.java:185)
at com.bayss.bws.common.utils.RocketMQUtil.crea