本文对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. C语言嵌套循环作业

    一.PTA实验作业 题目1:7-4 换硬币 1. 本题PTA提交列表 2. 设计思路 1.定义fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量,co ...

  2. 【评分】集美大学软件工程1413班工程项目管理个人作业2——APP案例分析

    [评分]个人作业2--APP案例分析 作业要求 作业地址及完成情况 博文要求 通过分析你选中的产品,结合阅读<构建之法>,写一篇随笔,包含下述三个环节的所有要求. 第一部分 调研, 评测 ...

  3. 学号:201621123032 《Java程序设计》第12周学习总结

    1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2:面向系统综合设计-图书馆管理系统或购物车 2.1: 简述如何使用流与文件改造你的系统.文件中数据的格式如何? ...

  4. Flask学习 一 基本结构

    -from flask import Flask +from flask import Flask,render_template -from flask import request -from f ...

  5. 修改MYSQL的默认连接时长

    show global variables like 'wait_timeout'; 设置成10小时; set global wait_timeout=36000;

  6. surging教学视频资源汇总

    surging是什么 surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询.压力最小优先作 ...

  7. php的控制器链

    控制器之间协同工作就形成了控制器链· 比如在一个控制器的方法中,创建另外一个·控制器,创建对象,然后调用第二个控制器方法,那么在第一个控制器分配给视图的变量,在 第二个控制器的方法中对应的视图也是可以 ...

  8. unity3D 知识点随手记

    最近闲来无事,记记unity3D相关的一些知识点吧,也当作笔记存储.转载请标明出处:http://www.cnblogs.com/zblade/ 1.unity是如何调用Start/Awake等相关函 ...

  9. GIT入门笔记(12)- 删除文件、提交删除和恢复删除

    在Git中,删除也是一个修改操作,我们实战一下, 1.先添加add一个新文件test.txt到Git并且提交commit到本地版本库: $ git add test.txt$ git commit - ...

  10. NHibernate与IbatisNet的简单比较

    NHibernate是当前最流行的Java O/R mapping框架Hibernate的移植版本,当前版本是1.0 rc-1.它出身于sf.net..IbatisNet是另外一种优秀的Java O/ ...