2015-04-12 73 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'。上面提到的註釋也是一樣的。 –