Spring integration 消息驱动通道适配器和多线程
在我的项目中,我有一千个队列,我希望每个队列有一个消费者来同步地消费消息 我有一个线程池大小为20的任务执行器,由数千个消息驱动的通道适配器共享 启动应用程序时,我必须等待40分钟才能看到所有队列侦听器都已启动。我看不出问题出在哪里Spring integration 消息驱动通道适配器和多线程,spring-integration,Spring Integration,在我的项目中,我有一千个队列,我希望每个队列有一个消费者来同步地消费消息 我有一个线程池大小为20的任务执行器,由数千个消息驱动的通道适配器共享 启动应用程序时,我必须等待40分钟才能看到所有队列侦听器都已启动。我看不出问题出在哪里 <int-jms:message-driven-channel-adapter id="jmsAdapter" acknowledge="transacted" connection-fa
<int-jms:message-driven-channel-adapter
id="jmsAdapter"
acknowledge="transacted"
connection-factory="cachedConnectionFactory"
destination="destination"
channel="inboundChannel"
max-concurrent-consumers="1"
concurrent-consumers="1"
auto-startup="false"
task-executor="taskExecutor"/>
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="20"/>
<property name="maxPoolSize" value="20"/>
</bean>
谢谢您不能跨容器共享线程-每个消费者都需要一个专用线程。默认情况下,容器线程将在JMS客户端代码中阻塞5秒钟,等待消息。如何启动侦听器?您的auto startup=false,所以我假设您使用控制总线或列表的编程启动。根据实现方式的不同,这可能是观察到的延迟的原因。auto startup=true不更改观察到的延迟我不能有一千个线程(上下文切换问题)。使用线程池accross消息侦听器还有另一种选择?。最好切换到int-jms:inbound channel adapter和带有taskExecutor的轮询器?是的,对于这个用例,轮询的通道适配器可能更适合,因为如果没有可用消息,线程(默认情况下)不会阻塞。但是你需要小心,你的任务执行器的队列不会被打包。你也可以考虑戏剧性地减少队列的数量,并使用一个头来识别发送者,而不是为每个单独的队列使用一个单独的队列。一个应用程序服务有数千个队列是有点不寻常的。