activeMQ的源码分析


我们将主要从如下几个方面来分析:

一、activeMQ的核心线程的功能和生命周期

二、消息存储的kaha实现的分析

三、消息队列(Queue)实现的分析

作为开篇,首先我们非常尊重activeMQ的所有committer,它是个不错的软件作品,我们的分析是基于5.1版本的代码,就象任何事情一样,尤 其是软件产品它的成熟是需要较长时间的过程,我们也会把分析中发现的5.1版本的bug于大家分享,下面我就以一个小bug作为整个activeMQ分析 的开篇。

为了表述的方便,我们把这个bug叫做bug_1,为了讲清楚该bug,首先我会把相关的背景做一个介绍:

消息指针(Message cursor)是activeMQ里一个非常重要的核心类,它是提供某种优化消息存储的方法。消息中间件的实现一般都是当消息消费者准备好消费消息的时 候,它会从持久化存储中一批一批的读取消息,并发送给消费者。消息指针维护着下一批待读取消息的相关位置信息。

消息指针在对不同的消息消费者时,它的内部处理机制也不一样:

1.当消费者跟得上消息生产者的时候,是快消费者。那这种时候Message cursor的内部过程如下图所示:

2.当消费者慢于消息生产者的时候,是慢消费者。那这种时候Message cursor的内部过程如下图所示:

上面两种情况是能自动调整的,当一个消费者从快变成慢或从慢变成快的时候,Message cursor应该做自动的调整,在5.1里面这种自动调整有bug,它只能从快变成慢,反之则不行。具体bug原因应该是疏忽写错了,代码在类 AbstractStoreCursor中的public final

synchronized void remove()方法中的if (size==0 && isStarted() && cacheEnabled)这一行,只用把cacheEnabled改为useCache就可以了。(该bug已经在后续版本里解决了)

我们非常愿意能推动activeMQ的使用,并希望能够结合activeMQ做一些相关的辅助工作。所以如果大家在实际工作中碰到使用activeMQ的 各种问题,如群集,消息重发等等,都可以告诉我们,大家一起交流,同时我们也会在线下召开一些交流activeMQ使用和研究的聚会,我们的联系方 式:email:

[email=yunweitec@yahoo.cn]yunweitec@yahoo.cn[/email] qq号码:1054618780

后文待续。

TCP通讯机制

图一

activeMQ支持多种通讯协议TCP/UDP等,我们选取最常用的TCP来分析activeMQ的通讯机制。首先我们来明确一个概念:

客户(Client):消息的生产者、消费者对activeMQ来说都叫作客户。

消息中转器(Message broker):它是activeMQ的核心,它接收信息并进行相关处理后分发给消息消费者。

为了能清楚的描述出activeMQ的核心通讯机制,我们选择3个部分来进行说明,它们分别是建立链接、关闭链接、心跳。

一、Client跟activeMQ的TCP通讯的初始化过程分析如下:

1. activeMQ初始化时,通过TcpTransportServer类根据配置打开TCP侦听端口,客户通过该端口发起建立链接的动作。

2. 把accept的Socket放入阻塞队列中。

3. 另外一个线程Socket handler阻塞着等待队列中是否有新的Socket,如果有则取出来。

4. 生成一个TransportConnection的实例。TransportConnection类的主要作用是处理链路的状态信息,并实现CommandVisitor接口来完成各类消息的处理。

5. TransportConnection会使用一个由多个TransportFilter实例组成的消息处理链条,负责对接收到的各类消息进行处理

并发送相应的应答。这

个链条的典型组成顺 序:

MutexTransport->WireFormatNegotiator->InactivityMonitor->TcpTransport。 在这条链条中最后的一环就是TcpTransport类,它是实际和Client获取和发送数据的地方,该类的重要方法有run()和oneway(), 一个负责读取,一个负责发送。

6. 建链完成,可以进行通讯操作。

二、关闭链接

activeMQ发现TCP链接的关闭,最关键的代码在TcpBufferedInputStream类中的

int n = in.read(buffer, position, buffer.length - position);

三、心跳

为了更好的维护TCP链路的使用,activeMQ采用了心跳机制作为判断双方链路的健康情况。activeMQ使用的是双向心跳,也就是 activeMQ的Broker和Client双方都进行相互心跳,但不管是Broker或Client心跳的具体处理情况是完全一样的,都在 InactivityMonitor类中实现,下面具体介绍。 心跳会产生两个线程“InactivityMonitor ReadCheck”和

InactivityMonitor WriteCheck”,它们都是Timer类型,都会隔一段固定时间被调用一次。ReadCheck线程主要调用的方法是readCheck(),当在 等待时间内,有消息接收到,则该方法会返回true。WriteCheck线程主要调用的方法是writeCheck(),这有个小技巧,大家可以参考一 下,那就是当WriteCheck线程休眠时,有任何数据发送成功,则该线程被唤醒后,不用通过TCP向对方真的发送心跳消息,这样可以从一定程度上减少 网络传输的数据量。

activeMQ的通讯处理机制还有很多,如断开重连等等,非常希望大家可以有兴趣来一起补充。

后文待续。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值