为什么 ExecutorChannel.onInit() 会重置调度程序?

Why is ExecutorChannel.onInit() resetting the dispatcher?

我有一个简单的工作 Spring 集成应用程序,它通过处理程序链将消息从入站 RabbitMQ 网关移动到 MongoDB 数据库中。当我从直接频道更改为执行程序频道时,我开始收到订户错误。在调试器中观察,我发现在设置 ExecutorChannel bean 之后,onInit() 方法被触发并将所有内容重置为默认值。我不明白为什么代码会被构造成这样做?我查看了 DirectChannel.onInit() 并且它只会在之前未设置值的情况下修改内容。有任何想法吗?我正在使用 Spring 集成 4.1.2.

// from
@Bean
DirectChannel uploadChannel( MessageHandlerChain uploadMessageHandlerChain ) {
    def bean = new DirectChannel()
    bean.subscribe( uploadMessageHandlerChain )
    bean
}

// to
@Bean
ExecutorChannel uploadChannel( MessageHandlerChain uploadMessageHandlerChain ) {
    def bean = new ExecutorChannel( Executors.newCachedThreadPool() )
    bean.subscribe( uploadMessageHandlerChain )
    bean
}

org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers

当您使用 XML 应用程序上下文创建通道时,您首先定义通道,然后在 EIP 模式中使用它:

<int:channel id="directChannel"/>
<int:service-activator input-channel="directChannel"/>

在我看来,这可以更好地分离关注点。相同的模式必须与 java 配置一起使用,首先声明您的频道然后声明 MessageHandlerChain 并订阅频道

@Bean
ExecutorChannel uploadChannel() {
    def bean = new ExecutorChannel( Executors.newCachedThreadPool() )
    bean
}

@Bean
MessageHandlerChain uploadMessageHandlerChain(){
    def uploadMessageHandlerChain = new MessageHandlerChain()
    uploadChannel().subscribe(uploadMessageHandlerChain)
    uploadMessageHandlerChain
}