每個目標的策略
每個目標(佇列或主題)可以應用多種不同的策略,或者使用萬用字元表示法來應用於佇列或主題的階層結構,因此可以配置如何處理 JMS 目標空間的不同區域。
以下屬性可以應用於主題和/或佇列
通用屬性 | 預設值 | 說明 |
---|---|---|
advisoryForConsumed |
false |
當用戶端取用訊息時,傳送一個諮詢訊息。 |
advisoryForDelivery |
false |
當訊息傳送至用戶端時,傳送一個諮詢訊息。 |
advisoryForFastProducers |
false |
如果生產者被認為速度快,則傳送一個諮詢訊息。 |
advisoryForSlowConsumers |
false |
如果消費者被認為速度慢,則傳送一個諮詢訊息。 |
advisoryWhenFull |
false |
當限制(記憶體、儲存、臨時磁碟)已滿時,傳送一個諮詢訊息。 |
enableAudit |
true |
當 true 時,broker 會追蹤重複的訊息。重複訊息可能在容錯移轉期間發生於非持久性訊息。 |
gcInactiveDestinations |
false |
垃圾回收非作用中的目標。 |
inactiveTimoutBeforeGC |
5000 |
目標被視為非作用中的逾時時間(毫秒)。 |
includeBodyForAdvisory |
false |
將觸發諮詢的原始訊息主體包含在諮詢訊息的 dataStructure 欄位中(如適用)。通常會清除訊息主體。 |
maxBrowsePageSize |
400 |
瀏覽器一次從儲存體分頁的最大訊息數。 |
maxDestinations |
-1 |
(v5.12) 如果 >= 0 ,則設定可建立的最大目標數量。此參數旨在限制可在萬用字元目標下建立的階層式目標數量。 |
maxPageSize |
200 |
一次從儲存體分頁的最大訊息數。增加此值可提高包含由多個並行消費者取用的分組訊息的佇列目標的效能。 |
memoryLimit |
不適用 |
目標游標的記憶體限制(以位元組為單位)。此記憶體限制從屬於系統級記憶體限制,如 <systemUsage>/<memoryUsage> 屬性所指定。此值沒有預設值;它只是作為整體 broker 記憶體的子項,直到 broker 記憶體耗盡。注意:當指定此限制時,目標的 cursorMemoryHighWaterMark 將應用於該限制,而不是 <systemUsage>/><memoryUsage> 記憶體限制。 |
minimumMessageSize |
1024 |
對於非序列化的訊息(嵌入式 broker)- 用於記憶體使用量計算的訊息假設大小。序列化訊息使用序列化的大小作為記憶體計算的基礎。 |
prioritizedMessages |
false |
保留訊息優先權資訊。 |
producerFlowControl |
true |
如果 true ,broker 會節流(流量控制)生產者。節流可以透過扣留生產者的 ACK 或在本地資源(例如,記憶體和/或儲存)耗盡時引發 javax.jms.ResourceAllocationException (傳播回用戶端)來實現。如果 false ,則會將多餘的訊息寫入訊息儲存體,以防止記憶體耗盡。但是,當訊息儲存體達到容量時,生產者將被節流,直到資源釋放。 |
slowConsumerStrategy |
null |
設定處理慢速消費者的策略。請參閱 AbortSlowConsumerStrategy. |
storeUsageHighWaterMark |
100 |
超過 <systemUsage>/<storeUsage> 儲存限制的百分比 (%) 閾值,當超過此值時會導致生產者傳送被封鎖。 |
useCache |
true |
如果 true ,則會快取持久訊息,以便從儲存體快速擷取。 |
usePrefetchExtension |
true |
當訊息傳遞但未 ACK 時,會使用預取擴充,以便 broker 可以分派另一個訊息,例如,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,則在 broker 第一次分派持久訊息之前,會重寫訊息以反映可能的傳遞。這可確保訊息 JMSRedelivered 標頭是可能重複傳遞的可靠指示。 |
queuePrefetch |
不適用 |
為使用預設值的消費者設定預取。 |
strictOrderDispatch |
false |
如果 true ,佇列將不會輪詢消費者,而是使用單一消費者,直到其預取緩衝區已滿。 |
timeBeforeDispatchStarts |
0 |
當第一個消費者連線時,等待指定的時間(以毫秒為單位),然後才開始訊息分派。 |
useConsumerPriority |
true |
從佇列分派訊息時,使用消費者的優先權。 |
以下屬性只能應用於主題
僅限主題屬性 | 預設值 | 說明 |
---|---|---|
advisoryForDiscardingMessages |
false |
當從非持久訂閱中捨棄訊息時,傳送一個諮詢。 |
cursorMemoryHighWaterMark |
70 |
應用於 <systemUsage>/<memoryUsage> 的百分比 (%) 閾值,當超過此值時,會導致目標的游標封鎖或寫入磁碟。 |
alwaysRetroactive |
false |
使所有訂閱者都具有追溯性,而無需修改用戶端來啟用此功能。 |
durableTopicPrefetch |
不適用 |
為使用預設值的持久主題消費者設定預取。 |
expireMessagesPeriod |
30000 |
非作用中持久訂閱者之間訊息過期檢查的間隔(以毫秒為單位)。注意:設定為 0 以停用訊息過期檢查。 |
topicPrefetch |
不適用 |
為使用預設值的主題消費者設定預取。 |
以下範例說明可在每個目標基礎上自訂的不同策略
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="https://activemq.dev.org.tw/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.dev.org.tw/schema/core https://activemq.dev.org.tw/schema/core/activemq-core.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker persistent="false"
brokerName="${brokername}"
xmlns="https://activemq.dev.org.tw/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>