Tho*_*hor 15 java jms hornetq jboss6.x
我有一个带HornetQ的JBoss-6服务器和一个队列:
<queue name="my.queue">
<entry name="/queue/test"/>
</queue>
Run Code Online (Sandbox Code Playgroud)
有连接到这个队列中一个不同的消费者(在不同的机器),但只有一个单一的消费者是活动的时间.如果我关闭此消费者,消息将立即由其他消费者处理.
由于我的消息有一些耗时的处理,我希望多个消费者同时处理它们的唯一消息.
我记得早期版本的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();
Run Code Online (Sandbox Code Playgroud)
和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) {}
}
}
Run Code Online (Sandbox Code Playgroud)
Cle*_*nic 15
在队列中有多个消费者的情况下,消息在消费者之间进行负载平衡.
由于您有一些消耗时间,您应该通过设置consumer-window-size来禁用缓冲.
在hornetQ上有一个关于分发的例子,关于如何禁用客户端缓冲并为慢速消费者提供更好的支持.(缓慢的消费者是消费者,他们会有一些时间来处理消息)
消息系统将预取/预读消息到客户端缓冲区,以加快处理速度并避免网络延迟.如果您有快速处理队列和单个使用者,则这不是问题.
JBoss Messaging在连接工厂提供了慢速消费者选项,而hornetq提供了消费者窗口大小.
大多数Message系统将为您提供启用或禁用客户端预取的方法.