ActiveMQ笔记:源码分析
本文对ActiveMQ的启动过程,以及BrokerService,TransportConnector和NetworkConnector等几个重要的模块的代码做一个简要的分析。
启动过程
如果要快速地了解系统的主要模块,最好的办法是熟悉该系统的启动过程。本文首先分析ActiveMQ的启动过程。
ActiveMQ可以作为一个独立的Java程序,单独运行。ActiveMQ也可以embed到其它的Java程序里面,作为该程序的一部分运行。
当ActiveMQ作为独立的程序运行时,实际执行的是${ActiveMQHome}/bin/ activemq.jar里的org.apache.activemq.console.Main。该Main类,可以执行activemq-console里的XXXCommand类定义的命令,根据传入Main类的XXX命令,调用相应的XXXCommand类命令。正常启动ActiveMQ,会使用“start”,因而会使用StartCommand类调用BrokerFactory.createBroker()来创建BrokerService。而该函数最终调用XBeanBrokerFactory.createBroker()创建XBeanBrokerService(是BrokerService的子类)。
如果ActiveMQ作为其它Java应用程序的一部分,常用的方法是使用Spring/XBean(XBean是在Spring的基础上进一步的简化了启动Bean所需要的配置)的机制。通过该机制,使用基于Spring的XML的配置文件,以及ActiveMQ的XBean定制的namespace,创建了XBeanBrokerService的bean。
可见,两种不同的方式,最终创建相同的XBeanBrokerService。该类的start()函数,通过创建Broker,TransportConnector,NetworkConnector等模块,完成ActiveMQ系统的启动。
TransportConnector
TransportConnector是ActiveMQ用来管理Client和Broker之间通信和传送消息的模块。
其中Transport接口定义了Client端和Broker通信的接口。ActiveMQ提供了多种Transport接口的实现类,如UDP,TCP,HTTP等。
TransportServer接口定义了Server端和Broker通信的接口。与Transport相对应,ActiveMQ提供了多种TransportServer接口的实现类,如UDP,TCP,HTTP等。
ActiveMQ定义了TransportFactory类,通过采用抽象工厂的Pattern,实现了ActiveMQ为不同的消息通信协议创建不同的Transport/TransportServer的实现。具体的TransportFactory实现类是通过active-client,active-http等jar文件的“META-INF/services/org/apache/activemq/transport/”定义的配置文件指定。
NetworkConnector
NetworkConnector是ActiveMQ用来管理Broker和Broker之间通信和传送消息的模块。ActiveMQ定义了几种NetworkConnector的实现类,缺省使用DiscoveryNetworkConnector类。
DiscoveryAgent是DiscoveryNetworkConnector用来发现互联的Broker的接口。ActiveMQ定义了多种的DiscoveryAgent的实现类,如HTTPDiscoveryAgent,SimpleDiscoveryAgent,MulticastDiscoveryAgent等。具体采用哪一种,是由< networkConnector>定义的URI的类型来决定。
Broker和Broker之间的通信和控制消息的交互是通过NetworkBridge来实现的。当DiscoveryAgent发现了互联的broker,会通知DiscoveryNetworkConnector,DiscoveryNetworkConnector会创建NetworkBridge来与新发现的Broker进行通信,实现消息互通。DiscoveryNetworkConnector,DiscoveryAgent和NetworkBridge通过XXXListener的机制实现状态控制。