具有多个参数的Spring集成网关方法

时间:2012-09-30 05:51:26

标签: parameters spring-integration gateway

我对网关和多个参数有疑问:

上下文: 我希望Gateway有两种方法:

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

第一种方法应该直接路由到执行查询的服务,而第二种方法应该路由到另一个服务以将queryId解析为Query,然后转到第一个Service以执行查询。

问题:将两个(或更多)参数作为Gateway方法的参数,最佳做法是什么?似乎整个模式的目标是只有一个参数对应一个Message。我应该使用邮件标题添加额外的参数吗?

2 个答案:

答案 0 :(得分:5)

我想问这个问题迫使我想一想这个问题。

我的问题的答案是:

网关只接受一个参数作为有效负载 - 其余参数带有自定义名称的标题字段。所以在我的情况下,我会这样做:

@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);

我确定哪些参数是有效负载,哪些是标题。然后每个方法将其消息定向到特定通道以进行服务激活。

在配置中,我像这样定义我的网关:

<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

答案 1 :(得分: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)