2012-09-30 39 views
3

我有一個關於網關和多參數的問題:Spring集成網關方法有多個參數

上下文: 我想一個網關有兩種方法:

search(Query query, FetchSpec fetchSpec); 
search(int queryId, FetchSpec fetchSpec); 

第一種方法應直接路由到執行查詢的服務,而第二個應該路由到另一個服務以將queryId解析爲查詢,然後再到第一個服務以執行查詢。

問題:將兩個(或多個)參數作爲網關方法參數的最佳做法是什麼?看來,整個模式的目標只有一個參數對應於一個消息。我應該使用郵件標題添加額外的參數嗎?

回答

5

我想這個問題迫使我去思考這個問題。

的回答我的問題是這樣的:

網關帶一個參數作爲有效載荷 - 其餘的去與自定義名稱headerfields。所以在我的情況下,我會做這樣的:

@Gateway (requestChannel = "incomingAdhocQuery") 
public ResultSet search(@Payload Query query, @Header("fetchSpec") FetchSpec fetchSpec); 

@Gateway (requestChannel = "incomingPersistedQuery") 
public ResultSet search(@Payload int queryId, @Header("fetchSpec") FetchSpec fetchSpec); 

我定義哪些參數是有效載荷,哪些是headers.Then每種方法指導其消息服務激活特定的渠道。

在配置上,我定義我的網關是這樣的:

<int:gateway service-interface="my.company.search.Search" /> 

然後我激活與每個網關的方法一個具體配置搜索服務:

<bean id="myManager" class="my.company.search.MyManager"/> 
<int:service-activator input-channel="incomingAdhocQuery" expression="@myManager.fetchByQuery(payload, headers['fetchSpec'])"/> 
<int:service-activator input-channel="incomingPersistedQuery" expression="@myManager.fetchById(payload, headers['fetchSpec'])"/> 

這樣,我設計我的經理是這樣的:

public ResultSet fetchById(int queryId, FetchSpec fetchSpec) {...} 

public ResultSet fetchByQuery(Query query, FetchSpec fetchSpec) {...} 

我覺得這個解決方案非常優雅,因爲我不必在我的服務中對Spring有任何依賴。只有網關需要這種依賴性。接線全部在彈簧配置中完成。我想我愛上了彈簧集成:-D

3

您可以使用下面的網關端:如果假設它

@Payload("T(java.util.Arrays).asList(#args[0],#args[1])") 
search(Query query, FetchSpec fetchSpec); 

在服務激活的同時,相同的簽名:

@ServiceActivator(inputChannel = "request", outputChannel = "reply") 
search(@Payload("#this[0]") Query query, @Payload("#this[1]") FetchSpec fetchSpec) 
相關問題