Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring SimpleMessageListenerContainer和TaskExecutor始终仅处理1条消息_Spring_Spring Jms - Fatal编程技术网

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