2016-07-06 3695 views
0

我試圖使用spring集成實現註釋驅動事件總線(例如Guava Event Bus)。 我有一個發佈訂閱通道我在那裏發佈我的活動,其想法是使用註解爲@ServiceActivator的方法作爲事件處理程序。 每種方法都可以根據需要處理的事件(有效負載)擁有不同的簽名。多個@ServiceActivator方法具有相同的inputChannel和不同的簽名

我注意到的是,當事件被髮布,ServiceActivatorAnnotationPostProcessor創建ServiceActivatingHandler的所有實例調用,對於具有不有效載荷匹配簽名中的每個方法的異常。例如。

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method handle(model.api.ServiceAvailableEvent) cannot be found on service.eai.TestServiceActivatorImpl2 type 

有沒有一種方式來定義僅適用於特定類型的有效載荷一個@ServiceActivator方法?

回答

0

這是正確的,PublishSubscribeChannel的所有訂戶接受相同的消息。如果沒有任何機會將傳入的有效負載轉換爲預期的方法參數類型,我們就會得到該異常。

如果你想過濾器意外的類型,你一定要使用@Filter之前你的@ServiceActivator。換句話說,您的操作與現在一樣,但要使用前面的過濾器作爲PublishSubscribeChannel的訂閱者,您的流程有點複雜。

你甚至可以依靠現有PayloadTypeSelector

@Bean 
@Filter(inputChannel = "publishSubscribeChannel", outputChannel="service1") 
public MessageSelector payloadTypeSelector() { 
    return new PayloadTypeSelector(...); 
} 

或者說,是的,它檢查​​類型並標有相同@Filter只是簡單的POJO方法。

我想你的下一個問題是:爲什麼@ServiceActivator忽略那些不適合目標方法的類型?

只是不要混淆擔心。服務激活器用於目標業務邏輯中的Message處理。爲了過濾和跳過,我們有一個不同的EI模式 - filter

+0

好的,謝謝你,我誤解了這種模式。我會想象,同樣的理性適用於網關。也就是說,所有使用「@Gateway」註解的方法都是訂閱相同的requestChannel,並且必須使用相同的有效內容。我對麼? –

+0

請注意,如果同一類中有多個方法具有不同的簽名,則框架將調用匹配有效負載的方法 - 只要它們是唯一且明確的。沒有;具有不同簽名的多個網關方法可以發佈到相同的頻道。 –

+0

'@網關'是一個完全不同的故事。它不是關於*訂閱*,而是*發佈*。 'requestChannel'用於通過網關的方法調用發送消息。對於不同的'@ Gateway',這可以是相同的頻道,但是您應該確切地將它們的參數計爲發送消息的'payload'。 –

相關問題