当前位置: 首页 > 知识库问答 >
问题:

DefaultMessageListenerContainer线程问题

扈翰
2023-03-14
<bean id="cachedConnectionFactory" 
          class="org.springframework.jms.connection.CachingConnectionFactory"
        p:targetConnectionFactory-ref="jmsConnectionFactory"
        p:cacheConsumers="false"
        p:sessionCacheSize="3" />
<bean id="jmsListenerContainerFactory"
          class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"
          p:connectionFactory-ref="cachedConnectionFactory"
          p:destinationResolver-ref="jndiDestinationResolver"
          p:concurrency="3-5"
          p:backOff-ref="exponentialBackOff"
          p:receiveTimeout="1000" />
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
    ...
    MyListener receiver = new MyListener();
    ...
    MessageListenerAdapter adapter = new MessageListenerAdapter(listener);
    adapter.setDefaultListenerMethod("onMessage");
    ...
    SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
    endpoint.setId(endpointId);
    endpoint.setDestination(...);
    endpoint.setMessageListener(adapter);
    registrar.registerEndpoint(endpoint);
}

它是工作的,因为我的listener类很好地接收消息,但日志看起来很奇怪。开始后,看起来只有一个线程在处理消息,即使队列中有几个线程在等待:

2014-12-29 15:10:53,978: INFO  [DefaultMessageListenerContainer-1] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:10:53,978: INFO  [DefaultMessageListenerContainer-3] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:10:53,978: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:10:53,995: INFO  [DefaultMessageListenerContainer-2] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:05,318: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:10,052: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:14,506: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:18,825: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:21,715: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:21,725: INFO  [DefaultMessageListenerContainer-5] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:25,152: INFO  [DefaultMessageListenerContainer-5] [MyListener.instantiateProcess():164] - Processing message
...
DefaultMessageListenerContainer-5 only until all 60 remaining messages have been read...

正如您所看到的,最终只有容器#5用于处理所有剩余的消息。消息不是并行处理的,定义的并发性似乎没有被使用。我不知道这是不是完全相同的问题,但我看过这篇文章,但我没有使用ActiveMQ,我没有这个预取选项。

你能解释一下我为什么会有这种行为吗。是弹簧配置错误还是其他问题?

    null

为什么最大线程数(5)或至少核心数(即3)几乎直到队列被完全清空才被使用?

共有1个答案

柏麒
2023-03-14

虽然这个问题很久以前就有人问过了。我最近也面临这个问题。为了他人的利益张贴答案。

需要将预取限制设置为1。您可以在连接字符串中提供这一点。

tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1

参考http://activemq.apache.org/what-is-the-prefetch-limit-for.html

 类似资料:
  • 我在Redhat ActiveMQ中有两个队列,一个用于消费,另一个用于生成和消费对象消息。 一旦从主队列中消耗,它会被推到第二队列进行进一步处理,但是当使用JmsTemboard时,消息会随机丢失, 我在DMLC容器2和JmsTemplate的ActiveMQConnectionFactory中使用相同的Bean 让我知道如何确保消息不会在JmsTemplate中丢失。

  • 我有一个DefaultMessageListenerContainer,它(在我看来)没有扩展。容器被定义为侦听队列,其中有100条消息。 我希望容器可以达到任何长度,消息将尽可能快地被使用(通过观察maxConcurrentConsumers配置)。所以我假设有7个ConcurrentConsumer。(在container-startup时由2个ConcurrentConsumer开始)一些日

  • 问题内容: 你好,我们已经在java 1.6,tomcat 6,oracle 11g上迁移了Java Web应用程序,但是现在一段时间站点关闭后我们遇到了问题:我们正在使Java堆内存不足错误并且许多线程处于等待状态。tomcat被绞死,我们的网站被压倒 信息:为地址为空且端口为80的连接器创建的最大线程数(200),2013年2月21日,这里是线程日志: 日志 结束 请指导。 谢谢阿鲁 问题答案

  • 1):单线程应用程序只会在用户的CPU上使用1个线程吗?提供更多的线程会使用多个CPU内核吗?如果声明的线程比用户的CPU多,会发生什么?

  • 我是机器人的新手,我有一些未解决的问题: > 我的项目有两个活动: 欢迎(显示layout1)。 MainDisplay(显示layout2)。

  • 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有;可能有些问题对应的答案也有;也可能有些各位网友也都看过。但是本文写作的重心就是所