2012-09-30 41 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) 
相关问题