消費者非同步派送
概述
從 ActiveMQ Classic v4 開始:代理程式執行同步或非同步派送給消費者的選擇變得更可配置。它現在在連線 URI、連線和連線工廠上配置為預設值,並且可以透過目的地選項在每個消費者的基礎上進行自訂,而不是像以前那樣僅作為傳輸伺服器設定。
這更有意義,因為您希望對較慢的消費者進行非同步訊息傳遞,但對較快的消費者進行同步訊息傳遞(以避免新增另一個 SEDA 佇列的同步和上下文切換成本)。使用同步訊息傳遞的缺點是,如果有一個較慢的消費者正在接收訊息,則生產者更有可能被封鎖。
預設設定為 dispatchAsync=true
,這是高效能的最佳設定。如果您想要更好地處理慢速消費者,您將需要啟用此設定。如果您想要更高的吞吐量並且出現慢速消費者的機率很低,您可能需要將其變更為 dispatchAsync=false
。
在連線工廠層級配置非同步派送
((ActiveMQConnectionFactory)connectionFactory).setDispatchAsync(false);
在連線層級配置非同步派送
在此層級配置 dispatchAsync
設定會覆蓋連線工廠層級的設定。
使用目的地 URI 在消費者層級配置非同步派送
使用目的地選項配置 dispatchAsync
會覆蓋連線和連線工廠層級的設定。
queue = new ActiveMQQueue("TEST.QUEUE?consumer.dispatchAsync=false");
consumer = session.createConsumer(queue);
在代理程式的傳輸連接器上停用非同步派送
可以透過 disableAsyncDispatch
屬性在特定傳輸連接器上停用非同步派送。一旦為此傳輸停用,個別用戶端就無法啟用它。
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616" disableAsyncDispatch="true"/>