我有一个带有HornetQ的JBoss-6服务器和一个队列:
<queue name="my.queue">
<entry name="/queue/test"/>
</queue>有不同的使用者(在不同的机器上)连接到这个队列,但一次只有一个使用者处于活动状态。如果我关闭了这个使用者,消息就会立即由另一个使用者处理。
因为我的消息有一些耗时的处理,所以我希望多个使用者同时处理他们唯一的消息。
我记得在早期版本的JBoss中也有类似的情况,在这些版本中,这种设置没有出现问题。在Jboss-6中,消息传递系统运行良好--除了上面描述的问题。这个问题类似于Are multiple client consumers possible in 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) {}
}
}发布于 2011-08-10 14:43:19
在一个队列中有多个使用者时,消息在消费者之间是负载平衡的。
由于您有一些时间消耗消息,您应该通过设置使用者窗口大小来禁用缓冲。
在hornetQ上有一个关于发行版的示例,介绍如何禁用客户端缓冲并更好地支持慢速用户。(慢消费者是有时间处理消息的消费者)
消息系统将预取/预读消息到客户端缓冲区,以加快处理速度并避免网络延迟。如果您有快速处理队列和单个使用者,则这不是问题。
JBoss消息传递在连接工厂提供了慢用户选项,而hornetq提供了消费者窗口大小。
大多数消息系统将为您提供启用或禁用客户端预取的方法。
发布于 2011-08-10 10:00:10
对不起,我不明白到底是什么问题。我们在2.0.0.GA版本和2.2.2.Final版本中使用了hornetq。在这两种情况下,基于队列的负载平衡都很好。如果要为一个队列定义多个使用者,并且它们都处于活动状态,则消息将自动在它们之间分发。第一条信息给消费者A,第二条给消费者B,第三条给消费者C等等。多个使用者的队列就是这样工作的--这是免费的负载平衡:)当您关闭一个使用者时,其他人会收到更多的消息,这是正常的。
https://stackoverflow.com/questions/7008664
复制相似问题