本文对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的机制实现状态控制。

ActiveMQ笔记:源码分析的更多相关文章

  1. bootstrap-modal 学习笔记 源码分析

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,怎么用直接官网 http://twitter.github.io/bootstrap/ 我博客的定位就是把这些年看过的源码给慢慢 ...

  2. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  3. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  4. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  5. zeromq源码分析笔记之线程间收发命令(2)

    在zeromq源码分析笔记之架构说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由command_t结构体确定:另一类是socke ...

  6. Nginx学习笔记4 源码分析

    Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...

  7. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  8. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  9. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

  10. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

随机推荐

  1. css中的背景色渐变以及背景图的定位

    单纯的背景色渐变: background: -webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #fff), color-stop(1, #ddd) ...

  2. Java基础学习(二)

    软件设计原则: 为了提高软件的开发效率,降低软件开发成本,一个优良的软件系统应该具有以下特点: 1,可重用性:遵循DRY原则,减少软件中的重复代码. 2,可拓展性:当软件需要升级增加新的功能,能够在现 ...

  3. Linux进程间通信-消息队列(mqueue)

    前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信,本文将介绍Linux消息队列(posix)的通信机制和特点. 1.消息队列 消息队列的实现分为两种,一种为System V的消息队列,一种是P ...

  4. python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数

    一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...

  5. c++第0次作业

    1.你认为大学的学习生活.同学关系.师生应该是怎样? 随着大学生活的慢慢到来,我开始领悟到大学并不是自由的天堂,相反,我们更加的走进社会这个牢笼.在这个牢笼中有着从前的我们并不需要在意和考虑的规则与问 ...

  6. 2017-2018-1 我爱学Java 第二周 作业

    Android Game Discussion Questions Answers 20162309邢天岳 20162311张之睿 20162312张家铖 20162313苑洪铭 20162324春旺 ...

  7. javabean 是什么?

    JavaBean规范 Bean的中文含义是“豆子”,顾名思义,JavaBean是指一段特殊的Java类, 就是有默然构造方法,只有get,set的方法的java类的对象. 专业点解释是: JavaBe ...

  8. 在Eclipse中调用Algs4库

    首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File ...

  9. 浅谈数据结构vector

    vector: 又名 向量 1.C++中的一种数据结构. 2.是一个类. 3.相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. A.使用时, ...

  10. fabric.js和高级画板

    本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...