簡體   English   中英

具有多個使用者的JMS隊列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM