CAT client源码分析

10月 26, 2017 |

cat client的入口点是com.dianping.cat.Cat类,该类是单实例的,

private static Cat s_instance = new Cat();

当第一次调用com.dianping.cat.Cat.getManager()或者com.dianping.cat.Cat.getProducer()时会执行com.dianping.cat.Cat.checkAndInitialize()方法进行初始化

CAT使用了一个类似于spring container的plexus容器来执行依赖管理。它扫描classpath下各个jar中META-INF/plexus目录下所有的xml文件,将定义的组件加入组件管理器。

关键的初始化代码在

com.dianping.cat.CatClientModule.execute 方法中完成的,主要逻辑如下
Cat.getInstance().setContainer(((DefaultModuleContext) ctx).getContainer());
StatusUpdateTask statusUpdateTask = ctx.lookup(StatusUpdateTask.class);
Threads.forGroup("cat").start(statusUpdateTask);

Cat.setContainer初始化MessageManager和MessageProducer实例,MessageManager主要用于消息的发送,MessageManager的m_transportManager属性实现类为DefaultTransportManager, DefaultTransportManager初始化时会初始化TcpSocketSender, TcpSocketSender.initialize()方法中,有如下代码

Threads.forGroup("cat").start(this);
Threads.forGroup("cat").start(m_manager);
Threads.forGroup("cat").start(new MergeAtomicTask());

分别初始化了一个消息发送线程,网络连接状态监护线程,以及一个消息合并线程
MessageProducer用于消息的的产生,
statusUpdateTask任务用于被监控服务器的健康状态采集
在com.dianping.cat.configuration.DefaultClientConfigManager类中完成配置文件的解析(client.xml, app.properties)

Posted in: CAT

Comments are closed.