ActiveMQ利用selector消费在消息堆积量大的时候不起作用的解决
现象:
我们在使用activemq queue的时候,发送方会把两个城市的消息都发到一个queue里,但是会在消息扩展属性里加上代表不同城市的参数,然后两个城市的应用都会启带不同selector的消费者到queue里消费各自的消息。前几天A市的服务挂了,开始B市的服务还能正常的消费消息,当随着queue里消息堆积的越来越多,B市开始消费不到消息了。
原因:
经过查资料和翻源码了解到,ActiveMQ的内存分页体系结构,activemq把消息持久化到磁盘后,在空间可用时允许消息从从磁盘中以页为单位进入内存(对持久化消息使用存储游标),之后消息将会以页为单位,从一个挂起的游标(pending cursor)进入分发队列,而这样做的一个副作用就是,选择器只在内存中当前页的消息上进行评估过滤,所以但A市消息堆积占满的内存当前页后,B市服务就消费不到B市消息了。
解决办法:
只能调大分页每页的大小,来延长其他选择过滤器保证消费者正常工作的时间。具体配置在服务端activemq.xml 里面的maxPageSize:
<destinationPolicy&g