在后面的一系列文章中,我们将主要从如下几个方面来分析:
一、activeMQ的核心线程的功能和生命周期
二、消息存储的kaha实现的分析
三、消息队列(Queue)实现的分析
四、activeMQ的领域模型
五、activeMQ中TCP通讯机制
六、activeMQ的Cluster
七、activeMQ中内存使用和管理
作为开篇,首先我们非常尊重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已经被后续版本所修复)