[英]JMS queue with multiple consumers
我有一個帶HornetQ的JBoss-6服務器和一個隊列:
<queue name="my.queue">
<entry name="/queue/test"/>
</queue>
有連接到這個隊列中一個不同的消費者(在不同的機器),但只有一個消費者是活動的時間。 如果我關閉此消費者,消息將立即由其他消費者處理。
由於我的消息有一些耗時的處理,我希望多個消費者同時處理它們的唯一消息。
我記得早期版本的JBoss中有類似的設置,這種設置沒有問題。 在Jboss-6中,消息傳遞系統運行良好 - 除了上述問題。 這個問題與hornetq中的多個客戶端消費者類似嗎? ,但情景與我的情況不同。
更新1 :如果我關閉(STRG + C)一個消費者,則有一個短暫的超時(直到服務器識別丟失的消費者),直到下一個消費者獲得消息。
更新2 :代碼段
VoidListener ml = new VoidListener();
QueueConnectionFactory qcf = (QueueConnectionFactory)
ctx.lookup("ConnectionFactory");
QueueConnection conn = qcf.createQueueConnection();
Queue queue = (Queue) ctx.lookup(queueName);
QueueSession session = conn.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
QueueReceiver recv = session.createReceiver(queue,"");
recv.setMessageListener(ml);
conn.start();
和MessageListerner:
public class OlVoidListener implements MessageListener
{
public void onMessage(Message msg)
{
counter++;
logger.debug("Message ("+counter+") received");
try {Thread.sleep(15*1000);} catch (InterruptedException e) {}
}
}
在隊列中有多個消費者的情況下,消息在消費者之間進行負載平衡。
由於您有一些消耗時間,您應該通過設置consumer-window-size來禁用緩沖。
在hornetQ上有一個關於分發的例子,關於如何禁用客戶端緩沖並為慢速消費者提供更好的支持。 (緩慢的消費者是消費者,他們會有一些時間來處理消息)
消息系統將預取/預讀消息到客戶端緩沖區以加速處理並避免網絡延遲。 如果您有快速處理隊列和單個使用者,則這不是問題。
JBoss Messaging在連接工廠提供了慢速消費者選項,而hornetq提供了消費者窗口大小。
大多數Message系統將為您提供啟用或禁用客戶端預取的方法。
對不起,我無法理解究竟是什么問題。 我們在2.0.0.GA版本和2.2.2.Final中使用了hornetq。 在這兩種情況下,基於隊列的負載平衡工作正常。 如果要為一個隊列定義多個使用者並且所有隊列都處於活動狀態,則會自動在它們之間分發消息。 消費者A的第一條消息,消費者B的第二條消息,消費者C的第三條消息,依此類推。 這是多個消費者的隊列工作方式 - 它是免費負載平衡:)這是正常的,當你關閉一個消費者,其他人會收到更多的消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.