gpt4 book ai didi

java - 具有多个消费者的 JMS 队列

转载 作者:太空狗 更新时间:2023-10-29 22:55:08 24 4
gpt4 key购买 nike

我有一个带有 HornetQ 和单个队列的 JBoss-6 服务器:

<queue name="my.queue">  
<entry name="/queue/test"/>
</queue>

有不同的消费者(在不同的机器上)连接到此队列,但一次只有一个单个消费者处于 Activity 状态。如果我关闭这个消费者,消息会立即由其他消费者之一处理。

由于我的消息有一些耗时的处理,我希望多个消费者同时处理他们的独特消息。

我记得在 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) {}
}
}

最佳答案

队列中有多个消费者,消息在消费者之间进行负载平衡。

由于您有一些时间消耗消息,您应该通过设置消费者窗口大小来禁用缓冲。

在 hornetQ 上有一个关于分发的示例,关于如何禁用客户端缓冲并为慢速消费者提供更好的支持。 (慢消费者是指有一些时间处理消息的消费者)

消息系统会将消息预取/预读到客户端缓冲区,以加快处理速度并避免网络延迟。如果您有快速处理队列和单个消费者,这不是问题。

JBoss Messaging 在连接工厂提供慢消费者选项,而 hornetq 提供消费者窗口大小。

大多数消息系统都会为您提供启用或禁用客户端预取的方法。

关于java - 具有多个消费者的 JMS 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7008664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com