环境:OS X EI Capitan 10.11.4 + ActiveMQ 5.13
当生产者发送的持久化消息到达 broker 之后,broker 首先会把它保存在持久存储中。
接下来,如果发现当前有活跃的消费者,而且这个消费者的消费速度能跟上生产者的生产速度,那么 ActiveMQ 会直接把消息传递给 broker 内部跟这个消费者相关联的 dispatch queue;如果当前没有活跃的消费者或者消费者的消费速度跟不上生产者的生产速度,那么 ActiveMQ 会使用 Pending Message Cursors 保存对消息的引用。在需要的时候,Pending Message Cursors 会把消息引用传递给 broker 内部跟这个消费者相关联的 dispatch queue。
有两种 Pending Message Cursors:
(1)VM Cursor 在内存中保存消息的引用。
(2)File Cursor 首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。
Topic 和 Queue 都可以配置 Message Cursors。
1. 当消息消费者消费速度跟得上生产者生产消息的速度时,消息将会首先存储到 Message Store 中,然后会直接发送给与消费者关联的 Dispatch Queue。
2. 当消费者消费消息的速度跟不上生产者生产消息的速度时,消息将会首先存储到 Message Store 中,同时在 Pending Cursor 中保存对消息的引用,然后由 Pending Cursor 发送给与消费者关联的 Dispatch Queue。
默认的 message cursor 类型是基于 Store 的,还有两种其它类型的:VM Cursor 和 File Cursor。
3. VM Cursor:在内存中保存消息的引用。
4. File Cursor:首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。
5. Paging for Non-Persistent Messages
<policyEntries>
<policyEntry topic="org.apache.>" producerFlowControl="false" memoryLimit="1mb">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<deadLetterStrategy>
<individualDeadLetterStrategy topicPrefix="Test.DLQ." />
</deadLetterStrategy>
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
<pendingDurableSubscriberPolicy>
<vmDurableCursor/>
</pendingDurableSubscriberPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<policyEntries>
<policyEntry queue="org.apache.>">
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="Test.DLQ."/>
</deadLetterStrategy>
<pendingQueuePolicy>
<vmQueueCursor />
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
当生产者发送的持久化消息到达 broker 之后,broker 首先会把它保存在持久存储中。
接下来,如果发现当前有活跃的消费者,而且这个消费者的消费速度能跟上生产者的生产速度,那么 ActiveMQ 会直接把消息传递给 broker 内部跟这个消费者相关联的 dispatch queue;如果当前没有活跃的消费者或者消费者的消费速度跟不上生产者的生产速度,那么 ActiveMQ 会使用 Pending Message Cursors 保存对消息的引用。在需要的时候,Pending Message Cursors 会把消息引用传递给 broker 内部跟这个消费者相关联的 dispatch queue。
有两种 Pending Message Cursors:
(1)VM Cursor 在内存中保存消息的引用。
(2)File Cursor 首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。
Topic 和 Queue 都可以配置 Message Cursors。
1. 当消息消费者消费速度跟得上生产者生产消息的速度时,消息将会首先存储到 Message Store 中,然后会直接发送给与消费者关联的 Dispatch Queue。
2. 当消费者消费消息的速度跟不上生产者生产消息的速度时,消息将会首先存储到 Message Store 中,同时在 Pending Cursor 中保存对消息的引用,然后由 Pending Cursor 发送给与消费者关联的 Dispatch Queue。
默认的 message cursor 类型是基于 Store 的,还有两种其它类型的:VM Cursor 和 File Cursor。
3. VM Cursor:在内存中保存消息的引用。
4. File Cursor:首先在内存中保存消息的引用,如果内存使用量达到上限,那么会把消息引用保存到临时文件中。
5. Paging for Non-Persistent Messages
6. 为 Topic 配置 Message Cursor
<destinationPolicy>
<policyMap><policyEntries>
<policyEntry topic="org.apache.>" producerFlowControl="false" memoryLimit="1mb">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<deadLetterStrategy>
<individualDeadLetterStrategy topicPrefix="Test.DLQ." />
</deadLetterStrategy>
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
<pendingDurableSubscriberPolicy>
<vmDurableCursor/>
</pendingDurableSubscriberPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
7. 为 Queue 配置 Message Cursor
<destinationPolicy>
<policyMap><policyEntries>
<policyEntry queue="org.apache.>">
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="Test.DLQ."/>
</deadLetterStrategy>
<pendingQueuePolicy>
<vmQueueCursor />
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
参考文献:
1. http://activemq.apache.org/message-cursors.html
2. http://www.huaishao8.com/config/activemq/198.html