Spring SimpleMessageListenerContainer和TaskExecutor始终仅处理1条消息
我有一个使用Spring SimpleMessageListenerContainer和TaskExecutor始终仅处理1条消息,spring,spring-jms,Spring,Spring Jms,我有一个使用TaskExecutor(池大小=15)的SimpleMessageListenerContainer,它一次处理的消息永远不会超过1条。下面是它的配置方式 SimpleMessageListenerContainer设置包括: ThreadPoolExecutor设置为: corePoolSize=1 maximumPoolSize=15 工作队列=大小为200的LinkedBlockingQueue 我的期望: 我希望1 JMS使用者能够提取消息,并在一个后台taskExecu
TaskExecutor
(池大小=15)的SimpleMessageListenerContainer
,它一次处理的消息永远不会超过1条。下面是它的配置方式
SimpleMessageListenerContainer设置包括:
ThreadPoolExecutor设置为:
corePoolSize=1
maximumPoolSize=15
工作队列=大小为200的LinkedBlockingQueue
我的期望:
我希望1 JMS使用者能够提取消息,并在一个后台taskExecutor线程中尽可能快地运行它们。如果队列中有50条消息,那么它将删除所有50条消息。每次运行15次,而其他35次则保留在taskExecutor的LinkedBlockingQueue
内部队列中
实际发生的情况:
相反,我的应用程序一次处理一条消息。在JConsole中,我扩展了容器并公开了更多关于taskExecutor状态的JMX属性,我看到“taskExecutor”activeCount的最大值为1(例如ThreadPoolExecutor.getActiveCount()。ThreadPoolExecutor
从不移动到15。因此,JMS使用者仍然一次处理1条消息,即使线程池为15的taskExecutor正在处理这些消息
以下是在我用大量消息填满队列后,JConsoleJMX读数显示的内容
- ConcurrentConsumers=映射到Spring的SimpleMessageContainer.ConcurrentConsumers
- ActiveCount=映射到ThreadPoolExecutor.ActiveCount
- MinConcurrentConsumers=映射到ThreadPoolExecutor.corePoolSize
- MaxConcurrentConsumers=映射到ThreadPoolExecutor.maximumPoolSize
- InternalQueueCapacity=映射到ThreadPoolExecutor的LinkedBlockingQueue大小
我错过了什么?是否需要使用不同的Executor实现?我发现此链接有助于解决此问题: 我的corePoolSize是1,在内部,ThreadPoolExecutor只是将消息排队,并使用单个核心线程处理排队的消息。将corePoolSize设置得更高,可以增加我想要的#个线程
concurrentConsumers = 1 (e.g., 1 JMS consumer)
taskExecutor = instance of java.util.concurrent.ThreadPoolExecutor
corePoolSize = 1
maximumPoolSize= 15
workQueue = LinkedBlockingQueue<Runnable> with size 200