【问题标题】:does @jmslistener with same container factory share thread pool@jmslistener 是否与同一个容器工厂共享线程池
【发布时间】:2019-02-16 19:14:18
【问题描述】:

我在 Spring Boot 中有 2 个这样的 jmsliteners 设置:

@EnableJms

@JmsListener(id= "A1", destination = "dest1", containerFactory = "factory1")
@JmsListener(id= "A2", destination = "dest2", containerFactory = "factory1") 
public void onMessage(String request) {
    //some processing
}

@Bean(name = "factory1")
public JmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory cachingConnectionFactory){
 DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
    jmsListenerContainerFactory.setConnectionFactory(cachingConnectionFactory);
    jmsListenerContainerFactory.setConcurrency("2-10");
    jmsListenerContainerFactory.setSessionTransacted(true);
    jmsListenerContainerFactory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return jmsListenerContainerFactory;
}

由于 2 个 jmslistener 有不同的 id 但共享同一个 containerFactory,这 2 个 jmslistener 是否共享同一个线程池?

IE,如果我在 dest1 有 100 条消息,在 dest2 有 1 条消息,是否所有可用线程都将被侦听器 a1 占用,并且侦听器 a2 将无法运行,直到 a1 的大多数消息都被消费了吗?

理想情况下,这两个应该并行运行,我不想在我的处理中创建一些异步的未来任务。

【问题讨论】:

    标签: jms spring-jms


    【解决方案1】:

    它们是独立的;默认情况下,它们各自使用单独的SimpleAsyncTaskExecutor

    您可以使用TaskExecutor 配置工厂,并且容器将使用相同的,但是,如果它是一个池执行器,它必须有足够的线程来支持所有侦听器的最大并发总数。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2023-03-08
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      相关资源
      最近更新 更多