2015-04-12 51 views
1

我有一个简单的Spring集成应用程序,可以将消息从入站RabbitMQ网关,通过处理程序链移动到MongoDB数据库。当我从一个直接频道切换到执行者频道时,我开始收到用户错误。在调试器中观察事物我看到,在设置了ExecutorChannel bean之后,onInit()方法被触发并将所有内容重置为默认值。我无法弄清楚为什么代码将被结构化来做到这一点?我查看了DirectChannel.onInit(),它只是修改了事情,如果以前没有设置值。有任何想法吗?我正在使用Spring Integration 4.1.2。为什么ExecutorChannel.onInit()重置调度程序?

// 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 

回答

1

当您使用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 
} 
+0

尼古拉,即排序我需要的是什么。谢谢。 – user1836542

+0

如果我的答案解决了你的问题,请接受我的答案并将其提升为 –

+1

伙计们,为什么'MessageHandlerChain'' @ Bean'上的'@ ServiceActivator'不适合你?即使'订阅'的东西运作良好,你没有端点,你将无法'停止'在运行时听通道。 ''创建完全端点和'MessageHandler'。上面提到的注释也是一样的。 –