在Activemq以前的版本中,broker会把待发送的消息保存在内存中。这种方式的缺陷是当消费者消费的速度赶不上生产者的速度时,会在broker的内存中积攒大量的消息,当达到一个限额后,broker就不再接收消息。这时生产者就被阻塞了,直到broker将内存清理能保存消息后才能继续发送。
在5.0版本后,Activemq实现了一种新的内存模型来防止慢消费者阻塞快速生产者。通常消息在未发生或者发送后未收到消费者的确认信息时都会持久保存消息到存储中。当有消费者来可以消费消息时,broker会批量从存储中取出消息,发送给消费者。游标就是指向下次批量获取消息时的存储位置。
根据游标的保存方式不同,可分为三种:
Store-based cursors
broker默认采用的游标。它将游标信息保存在存储中。针对速度不同的消费者,这种游标机制采取的方式不同。对于快速消费者,因为消费速度很快,存储中的消息数量会很少,所以不需要游标。这时,消息发送到broker时,先保存在持久存储中,然后直接发送给了消费者。而对于慢消费者,消息的持久存储中会保存大量的消息,所以需要使用游标来指定下一次批量读取消息的位置。
VM cursors
若消费者能跟上生产者生产的速度,这时持久存储中消息虽然不是很多,但是若能也能在内存中保存一些游标,对获取存储中的消息的性能会有很大的提升。
File-based cursors
对VM cursors 的一种改进。当内存中的游标达到一定限额后,就会将一些游标存储到临时文件中。
Activemq默认使用store-based游标。当然也可为不同的Destination修改游标策略。通过修改destinationPolicy节点来更改默认配置。destinationPolicy节点包含多ge policyMap节点。policyMap包含一个policyEntries节点,policyEntries节点包含多个policyEntry 节点。policyEntry 就是具体的一个游标策略了。Topics的消费者分为持久订阅者和临时订阅者,所以有两套配置。Queues只有一类消费者,所以只有一套配置。对于持久订阅者可以使用PendingDurableSubscriberMessageStoragePolicy来指定游标策略。可配置的策略有vmDurableCursor和fileDurableSubscriberCursor.
对于临时订阅者可以使用pendingSubscriberPolicy 来指定。可配置的策略有vmCursor和fileCursor。下面是关于Topics的一些xml配置:
<beans ... >
<broker ...>
...
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="com.iona.>">
...
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
<PendingDurableSubscriberMessageStoragePolicy>
<fileDurableSubscriberPolicy />
</PendingDurableSubscriberMessageStoragePolicy>
...
</policyEntry>
...
</policyEntries>
</policyMap>
</destinationPolicy>
...
</broker>
...
</beans>
Queues 同样也有vm和file两种类型的游标存储策略。pendingQueuePolicy 节点的可配置子节点有vmQueueCursor和fileQueueCursor
<beans ... >
<broker ...>
...
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="com.iona.>">
...
<pendingQueuePolicy>
<vmQueueCursor />
</pendingQueuePolicy>
...
</policyEntry>
...
</policyEntries>
</policyMap>
</destinationPolicy>
...
</broker>
...
</beans>
分享到:
相关推荐
ActiveMQ队列消息过期时间设置和自动清除解决方案.docx
springboot集成activemq实现消息接收demo
一个jms activemq Topic 消息实例 关于jms JMS 是接口,相当于jdbc ,要真正使用它需要某些厂商进行实现 ,即jms provider 常见的jms provider 有 ActiveMQ JBoss 社区所研发的 HornetQ (在jboss6 中默认即可以...
详细描述了ActiveMQ消息过期-时间设置和自动清除解决方案。
用C#实现的ActiveMQ发布/订阅消息传送源程序
activeMQ的发送消息后接收者返回信息
SpringBoot快速玩转ActiveMQ消息队列,jdk8下的简要版介绍。
SpringBoot整合ActiveMQ(消息中间件)实现邮件发送功能,里面含有详细业务逻辑代码,配置文件等
ActiveMQ(包括消息生成端和andorid消息接受端),实现了点对点的消息推送,和广播消息推送,当然离线推送也实现了。
go语言实现的读取、发送消息到activemq,使用的stomp协议。
activeMQ的测试工具,用于发送和接收activeMQ消息,jar包形式的,安装完jdk之后用java -jar xxx.jar命令运行
Android基于MQTT协议利用ActiveMQ发送消息给Android端接收,属于长连接那种,类似Socket通信
springboot整合ActiveMQ源码,适合范围消息队列入门小伙伴,对ActiveMQ消息队列不太了解,不知道如何发送消息,接收消息可以围观。
activemq消息中间件-视频教程activemq消息中间件-视频教程activemq消息中间件-视频教程activemq消息中间件-视频教程
百度spring整合activemq 发现几乎都只是在xml文件配置固定的消息队列而且太麻烦。并没有根据需求进行动态生成主题和队列。本文档参考了纯粹的... activemq下载文件中有一个demo 包含所有jar包。此处就不上传了。
activemq消息持久化所需Jar包,详情请参见博文:http://blog.csdn.net/l1028386804/article/details/68997105
简单的activemq点对点的同步消息模型
NULL 博文链接:https://sswh.iteye.com/blog/1974169
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。 下载本压缩包后解压运行里面的activemq.bat即可。 http://192.168.0.61:8161/ 是管理ActiveMQ的后台管理系统入口, 如需在JAVA中使用,请下载本人的 ...
ActiveMQ 消息队列