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

Spring ThreadPoolTask​​Executor仅运行一个线程

闾丘博超
2023-03-14
问题内容

我们在JMS使用者中使用ThreadPoolExecutor,并将其注入DefaultMessageListenerContainer中。我希望这会在许多消息上运行并发线程,但是我们的日志显示线程ID不会改变,而我们的日志显示对于不同的消息处理,线程ID始终为24。

在这种情况下,这是spring配置:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"       
         p:connectionFactory-ref="cachedConnectionFactory"
         p:destination-ref="formsCRRDestination"
         p:messageListener-ref="formServicePojo"
         p:concurrentConsumers="5"
         p:idleTaskExecutionLimit="1"
         p:maxConcurrentConsumers="25"
         p:taskExecutor-ref="threadPoolExecutor"         
         destroy-method="doShutdown"     
    >


 <bean id="threadPoolExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
        <property name="corePoolSize" value="1"/>
        <property name="maxPoolSize" value="15"/>
        <property name="keepAliveSeconds" value="30"/>
    </bean>

在不将threadPoolExectuor Bean注入DefaultMessageListenerContainer中之后,现在正在不同的线程中执行消息。

这是结果配置:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"       
             p:connectionFactory-ref="cachedConnectionFactory"
             p:destination-ref="formsCRRDestination"
             p:messageListener-ref="formServicePojo"
             p:concurrentConsumers="5"
             p:idleTaskExecutionLimit="1"
             p:maxConcurrentConsumers="25"       
             destroy-method="doShutdown"     
        >

我尝试阅读文档,但我不明白为什么会这样。有什么解释吗?


问题答案:

在Spring中查看了ThreadPoolTask​​Executor代码并阅读了ThreadPoolTask​​Executor的Java文档之后,我认为这是答案:

无限队列。在所有corePoolSize线程都繁忙的情况下,使用无界队列(例如,没有预定义容量的LinkedBlockingQueue)将使新任务排队。因此,将仅创建corePoolSize线程。(因此,maximumPoolSize的值没有任何作用。)

在上面的配置中,默认情况下使用的是LinkedBlockingQueue,而corePoolSize为1。这就是为什么maximumPoolSize不起作用的原因。



 类似资料:
  • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。

  • 问题内容: 使用node.js时,我希望以每次仅运行10个(或n个)的方式访问多个远程URL。 如果本地发生异常(m次),我也想重试一个请求,但是当状态代码返回错误(5XX,4XX等)时,该请求将视为有效。 这对我来说真的很难缠住我的头。 问题: 无法尝试捕获http.get,因为它是异步的。 需要一种在失败时重试请求的方法。 我需要某种信号量来跟踪当前活动的请求计数。 当所有请求完成时,我想在列

  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 问题内容: 这是执行程序类的方法: 在这里,它等待第二秒,但是当我运行代码时,它将引发异常: 我无法关闭中的并发线程破坏。这是我的代码流: 用Java执行程序类创建一个新线程来运行某些任务,即用 等待10秒以完成任务。 如果任务已完成,则可运行线程也将终止。 如果任务未在10秒内完成,则类应终止线程。 除了在最后一个场景中终止任务以外,其他所有操作都正常。我该怎么办? 问题答案: 该方法只是防止其

  • 我用的是Netty camel-Netty:jar:2 . 10 . 0 . red hat-60024。下面是我对Netty监听器的配置 荨麻:tcp://10.1.33.204:9001?textline=true 在这里,我看到基于调试日志,Netty只创建一个工作线程,所以传入的消息被阻塞,直到现有的消息被处理。 喜欢: 2014-08-23 12:36:48,394|DEBUG|w I/

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?