当前位置: 首页 > 面试题库 >

具有多个使用者的JMS队列

段干宾白
2023-03-14
问题内容

我有一个带有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) {}
  }
}

问题答案:

在队列中有多个使用者时,消息在使用者之间进行负载均衡。

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

在hornetQ上,有一个分发示例,说明如何禁用客户端缓冲并为速度较慢的使用者提供更好的支持。(速度较慢的使用者是需要一些时间来处理消息的使用者)

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

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

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



 类似资料:
  • JMS队列有2个消费者,同步和异步Java应用程序进程等待响应。1)同步应用程序发送请求,并根据JMS相关ID等待响应60秒。2)异步线程将不断侦听同一队列。

  • 下面是我们设置的简化/示意图拓扑 每个节点(服务器)都是一个独立的(无集群)jboss应用服务器(Jboss-as7),包括消息传递服务器。 消息传递服务器部署许多JMS队列。 每个任务服务器为每个队列部署一个MDB,每个队列有许多使用者。 所有消息生产者使用相同的入站适配器,所有消息使用者使用相同的出站适配器。事实上,所有前端节点都是完全相同的(与所有服务器节点相同,配置相同,部署的工件相同)。

  • 我有一个由第三方发布的JMS队列。我想在不同的机器上设置多个使用者,只有一台特定机器的使用者确认该队列上的消息。简而言之,如果特定机器的使用者没有接收到消息,那么该消息不应从队列中删除。这是可以实现的吗?

  • 问题内容: 我有多个包含要发送的消息的BlockingQueues。消费者数量可能少于队列数量吗?我不想遍历队列并继续轮询它们(忙于等待),并且我不想为每个队列都分配一个线程。相反,当任何队列中都有消息可用时,我想唤醒一个线程。 问题答案: 您可以做的一个技巧是让队列排队。因此,您要做的是只有一个阻塞队列,所有线程都订阅该队列。然后,当您将某些内容排队到其中一个BlockingQueues中时,您

  • 我是新手RabbitMQ java客户端。我的问题:我创建了10个consumer并将它们添加到队列中。每个消费者使用10秒来处理我的流程。我检查了Rabbit的页面,我看到我的队列有4000条消息没有发送到客户端。我检查了日志客户端,结果是为一个消费者获取一条消息,10秒后,我为一个消费者获取一条消息,依此类推…我想要得到10个消息为所有消费者在当时(10个消息-10消费者过程在当时)请帮助我,

  • 我试图在Oracle中创建对多使用者队列的持久订阅。使用JMS Spring支持。这是一个Grails应用程序。 我的spring代码如下: 谁能给我指出正确的方向来创建一个持久订阅。我原以为我的“客户ID”和“订阅”值会为我做这件事。我需要在其他地方指定这些吗? 谢谢!