【问题标题】:Only one ActiveMQ session is handling messages只有一个 ActiveMQ 会话正在处理消息
【发布时间】:2016-05-19 08:48:37
【问题描述】:

在一个项目中,我使用ActiveMQ来处理比较多的消息。为此,有一个队列fooQueue,其中包含要处理的消息。

应用程序的两个实例正在使用 Spring JMS 处理来自该队列的消息。我通过以下方式设置了DefaultMessageListenerContainer

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestinationName(QUEUE_NAME);
container.setMessageListener(myMessageListener);
container.setConcurrency(getProperty("concurrency"));
container.setSessionTransacted(true);
container.setErrorHandler(new ErrorHandler());
return container;

通过查看 AMQ Web 控制台,我可以确认创建了正确数量的消费者和会话(会话/消费者)。但是,似乎一个会话正在完成大部分工作,这会导致应用程序有时被冻结。

该会话使大多数消息入队和出队,所有其他消息都远远少于它。如果我重新启动这两个应用程序实例之一,应用程序实例中的一个会话会接手工作,并且行为相同。

除了检查myMessageListener 是否阻塞之外,我还能做些什么吗?

【问题讨论】:

  • 您的事务管理是如何定义的?我有一个类似的问题,发送一堆消息会阻止在发送时使用相同的 connectionFactory 读取消息,结果是消息发送是在一个大型且长时间运行的事务中完成的。
  • 好提示。我将不得不检查它,但我已经看到一些线程等待提交事务。你是如何解决你的问题的?接收和发送的单独连接?
  • 我通过每条消息发送一个事务而不是一个大事务来解决这个问题。这些交易也做了一些 JPA 的事情..
  • 如果您使用的是 Spring JMS,您能否给我一个关于如何完成此任务的提示?谷歌搜索时没有发现任何明显的东西。:/
  • 我使用的是 sping jmstemplate 和 spring @Transactional,所以基本上将 @Transactional 注释移到调用链的下方。

标签: java activemq spring-jms consumer


【解决方案1】:

我们尝试了各种设置,增加内存,为每个队列使用单独的 KahaDB 实例等,但没有任何帮助。有帮助的是拆分队列。

【讨论】:

    【解决方案2】:

    您应该查看消费者的prefetch 设置及其工作原理。这听起来好像您正在启动一个实例,并且它在其他实例有机会之前从队列中获取了大量消息。降低预取值将导致更公平的分配。

    【讨论】:

    • 感谢您的提示。预取设置为0,这让问题更加神秘。:S
    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多