10

Spring 的DefaultMessageListenerContainer (DMLC) 具有concurrentConsumertaskExecutor属性。taskExecutor bean 可以被赋予corePoolSize属性。那么指定 concurrentConsumer 和 corePoolSize 有什么区别?定义 concurrentConsumer 属性时,意味着 Spring 将创建指定数量的消费者/消息侦听器来处理消息。corePoolSize 什么时候出现?

代码片段

<bean id="myMessageListener"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destination" ref="myQueue" />
    <property name="messageListener" ref="myListener" />
    <property name="cacheLevelName" value="CACHE_CONSUMER"/>
    <property name="maxConcurrentConsumers" value="10"/>
    <property name="concurrentConsumers" value="3"/>
    <property name="taskExecutor" ref="myTaskExecutor"/>
</bean>

 <bean id="myTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
    <property name="corePoolSize" value="100"/>
    <property name="maxPoolSize" value="100"/>
    <property name="keepAliveSeconds" value="30"/>
     <property name="threadNamePrefix" value="myTaskExecutor"/>
</bean>
4

2 回答 2

0

TaskExecutor 属性的用途

设置 Spring TaskExecutor 以用于运行侦听器线程。默认是一个 SimpleAsyncTaskExecutor,根据指定的并发消费者数量启动多个新线程。

指定一个替代 TaskExecutor 以与现有线程池集成。

以上来自[Spring Official Documentation][1]

当您指定替代任务执行器时,侦听器线程将使用定义的任务执行器,而不是使用 asyncTaskExcutor。

当我们用相同的 containerFactory 定义两个 jmsListener 时,这很容易说明。当你指定并发时,并发应该支持taskExecutor corePoolSize和maxPoolSize。

如果您将并发设置为 5-20 并且您有两个侦听器,那么您应该将核心 poolSize 设置为大于 10 并且将 maxPoolSize 设置为大于 40。然后侦听器可以相应地获取线程的并发限制。

在这种情况下,如果您将 maxPoolsize 设置为小于 10,那么侦听器容器将不会在 10 上。从春天开始,您也会收到以下警告

The number of scheduled consumers has dropped below concurrent consumers limit, probably due to tasks having been rejected. Check your thread pool configuration! Automatic recovery to be triggered by remaining consumers.

basically, the listener threads will act based on the taskExecutor property. 


于 2021-10-22T15:36:56.983 回答
0

根据 4.3.6 版本,taskExecutor包含AsyncMessageListenerInvoker负责消息处理的实例。corePoolSize是定义池中的物理线程数,concurrentConsumer而是该池中的任务数。我猜这个抽象是为了更灵活的控制而设计的。

于 2017-08-15T12:28:52.813 回答