rocketmq学习笔记 五 源码之rocketmq-tools
来源:互联网 发布:php大牛的博客 编辑:程序博客网 时间:2024/05/18 02:29
前面分析了rocketmq-namesrv的源码
其实很简单,lock+map 把注册中心的事情做了。 因为nameSrv 之间不用保证数据一致性。 每个节点都是独立的
本文接着学习 rocketmq-tools, 这个包主要实现了对mqadmin的支持
1.admin
admin 也是一个client端
DefaultMQAdminExt 和 DefaultMQAdminExtImpl 封装了一些mqadmin命令实现
2.command
把命令行的操作转换成java类,基于commons-cli 来做的一些封装
/** * @author shijia.wxr */public interface SubCommand { public String commandName(); public String commandDesc(); public Options buildCommandlineOptions(final Options options); public void execute(final CommandLine commandLine, final Options options, RPCHook rpcHook);}
MQAdminStartup
public static void initCommand() { initCommand(new UpdateTopicSubCommand()); initCommand(new DeleteTopicSubCommand()); initCommand(new UpdateSubGroupSubCommand()); initCommand(new DeleteSubscriptionGroupCommand()); initCommand(new UpdateBrokerConfigSubCommand()); initCommand(new UpdateTopicPermSubCommand()); initCommand(new TopicRouteSubCommand()); initCommand(new TopicStatusSubCommand()); initCommand(new TopicClusterSubCommand()); initCommand(new BrokerStatusSubCommand()); initCommand(new QueryMsgByIdSubCommand()); initCommand(new QueryMsgByKeySubCommand()); initCommand(new QueryMsgByUniqueKeySubCommand()); initCommand(new QueryMsgByOffsetSubCommand()); initCommand(new QueryMsgByUniqueKeySubCommand()); initCommand(new PrintMessageSubCommand()); initCommand(new SendMsgStatusCommand()); initCommand(new BrokerConsumeStatsSubCommad()); initCommand(new ProducerConnectionSubCommand()); initCommand(new ConsumerConnectionSubCommand()); initCommand(new ConsumerProgressSubCommand()); initCommand(new ConsumerStatusSubCommand()); initCommand(new CloneGroupOffsetCommand()); initCommand(new ClusterListSubCommand()); initCommand(new TopicListSubCommand()); initCommand(new UpdateKvConfigCommand()); initCommand(new DeleteKvConfigCommand()); initCommand(new WipeWritePermSubCommand()); initCommand(new ResetOffsetByTimeCommand()); initCommand(new UpdateOrderConfCommand()); initCommand(new CleanExpiredCQSubCommand()); initCommand(new CleanUnusedTopicCommand()); initCommand(new StartMonitoringSubCommand()); initCommand(new StatsAllSubCommand()); initCommand(new SyncDocsToGithubSubCommand()); initCommand(new AllocateMQSubCommand()); initCommand(new CheckMsgSendRTCommand()); initCommand(new CLusterSendMsgRTCommand()); }
3.github
上传wiki文件
4.monitor
public void start() throws MQClientException { this.defaultMQPullConsumer.start(); this.defaultMQAdminExt.start(); this.defaultMQPushConsumer.start(); this.startScheduleTask(); }
private void startScheduleTask() { this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { try { MonitorService.this.doMonitorWork(); } catch (Exception e) { log.error("doMonitorWork Exception", e); } } }, 1000 * 20, this.monitorConfig.getRoundInterval(), TimeUnit.MILLISECONDS); } public void doMonitorWork() throws RemotingException, MQClientException, InterruptedException { long beginTime = System.currentTimeMillis(); this.monitorListener.beginRound(); TopicList topicList = defaultMQAdminExt.fetchAllTopicList(); for (String topic : topicList.getTopicList()) { if (topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) { String consumerGroup = topic.substring(MixAll.RETRY_GROUP_TOPIC_PREFIX.length()); try { this.reportUndoneMsgs(consumerGroup); } catch (Exception e) { // log.error("reportUndoneMsgs Exception", e); } try { this.reportConsumerRunningInfo(consumerGroup); } catch (Exception e) { // log.error("reportConsumerRunningInfo Exception", e); } } } this.monitorListener.endRound(); long spentTimeMills = System.currentTimeMillis() - beginTime; log.info("Execute one round monitor work, spent timemills: {}", spentTimeMills);}
reportUndoneMsgs
private void reportUndoneMsgs(final String consumerGroup) { ConsumeStats cs = null; try { cs = defaultMQAdminExt.examineConsumeStats(consumerGroup); } catch (Exception e) { return; } ConsumerConnection cc = null; try { cc = defaultMQAdminExt.examineConsumerConnectionInfo(consumerGroup); } catch (Exception e) { return; } if (cs != null) { HashMap<String/* Topic */, ConsumeStats> csByTopic = new HashMap<String, ConsumeStats>(); { Iterator<Entry<MessageQueue, OffsetWrapper>> it = cs.getOffsetTable().entrySet().iterator(); while (it.hasNext()) { Entry<MessageQueue, OffsetWrapper> next = it.next(); MessageQueue mq = next.getKey(); OffsetWrapper ow = next.getValue(); ConsumeStats csTmp = csByTopic.get(mq.getTopic()); if (null == csTmp) { csTmp = new ConsumeStats(); csByTopic.put(mq.getTopic(), csTmp); } csTmp.getOffsetTable().put(mq, ow); } } { Iterator<Entry<String, ConsumeStats>> it = csByTopic.entrySet().iterator(); while (it.hasNext()) { Entry<String, ConsumeStats> next = it.next(); UndoneMsgs undoneMsgs = new UndoneMsgs(); undoneMsgs.setConsumerGroup(consumerGroup); undoneMsgs.setTopic(next.getKey()); this.computeUndoneMsgs(undoneMsgs, next.getValue()); this.monitorListener.reportUndoneMsgs(undoneMsgs); this.reportFailedMsgs(consumerGroup, next.getKey()); } } } }
reportConsumerRunningInfo
public void reportConsumerRunningInfo(final String consumerGroup) throws InterruptedException, MQBrokerException, RemotingException, MQClientException { ConsumerConnection cc = defaultMQAdminExt.examineConsumerConnectionInfo(consumerGroup); TreeMap<String, ConsumerRunningInfo> infoMap = new TreeMap<String, ConsumerRunningInfo>(); for (Connection c : cc.getConnectionSet()) { String clientId = c.getClientId(); if (c.getVersion() < MQVersion.Version.V3_1_8_SNAPSHOT.ordinal()) { continue; } try { ConsumerRunningInfo info = defaultMQAdminExt.getConsumerRunningInfo(consumerGroup, clientId, false); infoMap.put(clientId, info); } catch (Exception e) { } } if (!infoMap.isEmpty()) { this.monitorListener.reportConsumerRunningInfo(infoMap); } }
0 0
- rocketmq学习笔记 五 源码之rocketmq-tools
- rocketmq学习笔记 五 源码之rocketmq-namesrv
- rocketmq学习笔记 五 源码之rocketmq-store
- rocketmq学习笔记 五 源码之rocketmq-broker
- rocketmq学习笔记 五 源码之rocketmq-filtersrv
- rocketmq学习笔记 五 源码之rocketmq-remoting
- rocketMq源码学习 -- rocketmq源码学习计划
- rocketmq学习笔记 三 rocketmq功能梳理
- rocketmq学习笔记 四 rocketmq运行架构
- rocketmq consume学习笔记
- rocketmq入门学习笔记
- RocketMQ源码深度解析五之Consumer篇
- RocketMQ源码分析之NameServer
- ROCKETMQ 搭建 学习i笔记
- rocketmq笔记
- RocketMQ学习
- RocketMq学习
- RocketMQ学习
- NLog日志记录学习
- JavaScript函数式编程
- 深度探索c++对象模型之template的错误报告
- 【原创】【BZOJ】书的复制
- Android Messenger进程间双向通信详解
- rocketmq学习笔记 五 源码之rocketmq-tools
- 微信公众号关注用户的信息拉取
- 卷积神经网络(CNN)代码实现(MNIST)解析
- 基础练习——百钱买百鸡(C++)
- AdPlug库介绍
- 系统架构
- PAT B1048
- Redis SDS
- Camera基本开发知识