概要

activemq是一个apache的顶级项目,其实现了JMS规范,作为一个开源的JMS实现,activemq已经在很多地方得到了应用。同时,开源小组在研究JMS实现的时候,也选择了activemq作为研究对象,希望能够读其源码,让开源小组更好的明白JMS规范和实现。

在学习activemq的时候,我们发现还不能一下子就进去学习JMS规范的实现,而是需要了解其底层代码,包括其对网络连接的处理等等。所以,这篇文章就学习了activemq的网络层实现

activemq网络层概念

activemq 是支持多协议的,因此,把单一协议的server抽象成更高一层,就很有意义,请看下面这张图:

在activemq中,差不多每种概念都有生命周期(见Service接口)。
这张图十分简单,实际中当然比这个要复杂。下面针对每个概念进行叙述。

Transport

Transport 应该算是很底层的概念,他封装了 Socket,职责是发送和接受连接方的信息。
同时,在Transport中,增加了同步和异步的概念。
Transport拥有一个TransportListener。

TransportListener

顾名思义,TransportListener 就是监听 Transport 事件的发生以及做出一定的反映。
在activemq中,正是利用了 TransportListener 对 Command 进行处理 —— Command 是 activemq 网络传递的形式,每个请求都会被反序列化成一个 Command。

TransportServer

就是一个server实例,他会处理外部进来的Socket,进而封装成 Transport 。此 Server 拥有一个 TransportAcceptListener 。

TransportAcceptListener

负责 Accept Transport,将 Transport 封装成 Connection,从而开启 Connection 的生命周期。
这里需要注意的是:TransportServer 将 Socket 封装成 Transport,而 TransportAcceptListener 将 Transport 封装成 Connection。

Connection

可以理解成业务层面上的连接。 Connection 会给相应的 Transport 设置 TransportListener ,从而获取底层 Socket 的活动情况,进行业务的处理。

Connector

Connector就是较高层次的抽象,它代表对外的连接器,每个连接器都可以支持不同的协议。
Connector 通过给 TransportServer 设置 TransportAcceptListener ,从而能够控制 Transport 并产生相应的 Connection。

总结

总体来说,两个Listener是连接 Conncetor与TransportServer 和 Connection和Transport 的关键概念。
至于为什么要分成 Connector , TransportServer 这两层,我想原因应该就是开头提到的: activemq需要支持多协议,因此 Connector 抽象起来,可以当作是针对不同协议的统一行为;而 TransportServer 就是针对各协议的具体实现。 对于 Connection,Transport 来说, Connector 是与 Connection 统一层次, Transport 是与 TransportServer 统一层次。