Spring integration 消息驱动通道适配器和多线程

Spring integration 消息驱动通道适配器和多线程,spring-integration,Spring Integration,在我的项目中,我有一千个队列,我希望每个队列有一个消费者来同步地消费消息 我有一个线程池大小为20的任务执行器,由数千个消息驱动的通道适配器共享 启动应用程序时,我必须等待40分钟才能看到所有队列侦听器都已启动。我看不出问题出在哪里 <int-jms:message-driven-channel-adapter id="jmsAdapter" acknowledge="transacted" connection-fa

在我的项目中,我有一千个队列,我希望每个队列有一个消费者来同步地消费消息

我有一个线程池大小为20的任务执行器,由数千个消息驱动的通道适配器共享

启动应用程序时,我必须等待40分钟才能看到所有队列侦听器都已启动。我看不出问题出在哪里

<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的轮询器?是的,对于这个用例,轮询的通道适配器可能更适合,因为如果没有可用消息,线程(默认情况下)不会阻塞。但是你需要小心,你的任务执行器的队列不会被打包。你也可以考虑戏剧性地减少队列的数量,并使用一个头来识别发送者,而不是为每个单独的队列使用一个单独的队列。一个应用程序服务有数千个队列是有点不寻常的。