按目的地策略
可以对每个目的地(队列或主题)应用多种不同的策略,或者使用通配符表示法应用于队列或主题的层次结构,因此可以配置如何处理 JMS 目的地空间的不同区域。
以下属性可以应用于主题和/或队列
通用属性 | 默认值 | 描述 |
---|---|---|
advisoryForConsumed |
false |
当客户端消费消息时,发送一条通知消息。 |
advisoryForDelivery |
false |
当消息发送到客户端时,发送一条通知消息。 |
advisoryForFastProducers |
false |
如果生产者被认为是快速的,则发送一条通知消息。 |
advisoryForSlowConsumers |
false |
如果消费者被认为是缓慢的,则发送一条通知消息。 |
advisoryWhenFull |
false |
当限制(内存、存储、临时磁盘)已满时,发送一条通知消息。 |
enableAudit |
true |
当 true 时,代理将跟踪重复消息。在故障转移期间,非持久消息可能会发生重复。 |
gcInactiveDestinations |
false |
垃圾回收不活动的目的地。 |
inactiveTimoutBeforeGC |
5000 |
目的地被认为不活动的超时时间(以毫秒为单位)。 |
includeBodyForAdvisory |
false |
将触发通知的原始消息的主体包含在通知消息中的 dataStructure 字段中(如果适用)。通常会清除消息主体。 |
maxBrowsePageSize |
400 |
浏览器一次从存储区中分页的最大消息数。 |
maxDestinations |
-1 |
(v5.12) 如果 >= 0 ,设置可以创建的目的地数量上限。此参数旨在限制可以在通配符目的地下创建的层次结构目的地的数量。 |
maxPageSize |
200 |
一次从存储区中分页的最大消息数。增加此值以提高包含多个并发消费者消费的分组消息的队列目的地的性能。 |
memoryLimit |
n/a |
目的地的游标的内存限制(以字节为单位)。此内存限制从属于系统级内存限制,如 <systemUsage>/<memoryUsage> 属性中指定的那样。此值没有默认值;它只是作为整个代理内存的子项,直到代理内存耗尽为止。注意:当指定此限制时,目的地的 cursorMemoryHighWaterMark 将针对它应用,而不是针对 <systemUsage>/><memoryUsage> 内存限制。 |
minimumMessageSize |
1024 |
对于非序列化消息(嵌入式代理) - 用于内存使用计算的假定消息大小。序列化消息使用序列化大小作为内存计算的基础。 |
prioritizedMessages |
false |
持久化消息优先级信息。 |
producerFlowControl |
true |
如果 true ,代理将限制(流量控制)生产者。限制是通过保留生产者的 ACK 或通过在本地资源(例如内存和/或存储)耗尽时引发 javax.jms.ResourceAllocationException (将其传播回客户端)来实现的。如果 false ,多余的消息将被写入消息存储以防止内存耗尽。但是,当消息存储达到容量时,生产者将被限制,直到释放资源为止。 |
slowConsumerStrategy |
null |
设置处理缓慢消费者的策略。参见 AbortSlowConsumerStrategy. |
storeUsageHighWaterMark |
100 |
当超过 <systemUsage>/<storeUsage> 存储限制的百分比 (%) 阈值时,会引起生产者发送阻塞。 |
useCache |
true |
如果 true ,则会缓存持久消息以从存储中快速检索。 |
usePrefetchExtension |
true |
当消息被传递但未被 ACK 时,使用预取扩展,以便代理可以调度另一条消息,例如 prefetch == 0 ,其想法是始终会有预取数目的消息处于挂起状态。它还允许事务批处理超过预取 值。 |
sendDuplicateFromStoreToDLQ |
false |
(v5.17.0) 如果 true ,将在检测到 duplicateFromStore 条件时将消息的副本发送到 DLQ。在 v5.17.0 之前,默认行为是 true |
sendFailIfNoSpace |
false |
(v5.16.0) 如果 true ,当目的地达到其资源限制(内存或存储)时,会导致发送失败并出现 javax.jms.ResourceAllocationException |
sendFailIfNoSpaceAfterTimeout |
0 |
(v5.16.0) 如果 > 0 ,当目的地资源限制(内存或存储)在配置的毫秒持续时间内保持耗尽时,会导致发送失败并出现 javax.jms.ResourceAllocationException |
以下属性 只能应用于队列
仅队列属性 | 默认值 | 描述 |
---|---|---|
allConsumersExclusiveByDefault |
false |
当 true 时,所有消费者都是专用的。参见 专用消费者 |
cursorMemoryHighWaterMark |
70 |
应用于 <systemUsage>/<memoryUsage> 或目的地的 memoryLimit (如果定义)的百分比 (%) 阈值,当超过此阈值时,会导致目的地的游标阻塞或写入磁盘。 |
consumersBeforeDispatchStarts |
0 |
当第一个消费者连接时,等待指定数量的消费者,然后开始消息调度。 |
expireMessagesPeriod |
30000 |
检查队列消息消息过期时间的周期(以毫秒为单位)。值 0 将禁用过期时间检查。 |
lazyDispatch |
false |
仅从存储区中分页进可以一次调度的消息数量。 |
maxExpirePageSize |
400 |
定期到期消息时分页进的最大消息数。如果内存中待调度消息的数量小于此值,并且存储区中有要分页进的消息,则根据此设置对消息进行分页。在将消息从存储区分页进内存时,会在分页步骤中对消息进行到期处理。分页过程完成后,将从内存中待调度消息列表中到期消息,然后从内存中尚未针对订阅定位的消息列表中到期消息。 |
optimizedDispatch |
false |
不要为从队列中调度使用单独的线程。 |
persistJMSRedelivered |
false |
(v 5.10) 如果为 true,则在代理首次调度持久消息之前,将重写消息以反映可能的传递。这确保了消息 JMSRedelivered 标头是可能重复传递的可靠指示。 |
queuePrefetch |
n/a |
设置使用默认值的消费者的预取。 |
strictOrderDispatch |
false |
如果 true ,则队列不会循环调度消费者,而是会使用一个消费者,直到其预取缓冲区已满。 |
timeBeforeDispatchStarts |
0 |
当第一个消费者连接时,等待指定时间(以毫秒为单位),然后开始消息调度。 |
useConsumerPriority |
true |
从队列中调度消息时,使用消费者的优先级。 |
以下属性 只能应用于主题
仅主题属性 | 默认值 | 描述 |
---|---|---|
advisoryForDiscardingMessages |
false |
当从非持久订阅中丢弃消息时,发送一条通知。 |
cursorMemoryHighWaterMark |
70 |
应用于 <systemUsage>/<memoryUsage> 的百分比 (%) 阈值,当超过此阈值时,会导致目的地的游标阻塞或写入磁盘。 |
alwaysRetroactive |
false |
使所有订阅者都具有追溯性,从而无需修改客户端来启用此功能。 |
durableTopicPrefetch |
n/a |
设置使用默认值的持久主题消费者的预取。 |
expireMessagesPeriod |
30000 |
非活动持久订阅者之间的消息过期时间检查间隔(以毫秒为单位)。注意:设置为 0 以禁用消息过期时间检查。 |
topicPrefetch |
n/a |
设置使用默认值的主题消费者的预取。 |
以下是一些可以在每个目的地基础上自定义的不同策略的示例
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="https://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
https://activemq.apache.org/schema/core https://activemq.apache.org/schema/core/activemq-core.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker persistent="false"
brokerName="${brokername}"
xmlns="https://activemq.apache.org/schema/core">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="FOO.>">
<dispatchPolicy>
<roundRobinDispatchPolicy/>
</dispatchPolicy>
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="ORDERS.>">
<dispatchPolicy>
<strictOrderDispatchPolicy/>
</dispatchPolicy>
<!-- Recover 1 minute's worth -->
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="60000"/>
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="PRICES.>">
<!-- Force pending messages to be discarded for slow consumers -->
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="10"/>
</pendingMessageLimitStrategy>
<!-- 10 seconds worth -->
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="10000"/>
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry tempTopic="true" advisoryForConsumed="true"/>
<policyEntry tempQueue="true" advisoryForConsumed="true"/>
</policyEntries>
</policyMap>
</destinationPolicy>
</broker>
</beans>