4

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

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

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

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

问题:将两个(或更多)参数作为网关方法的参数的最佳实践是什么?似乎整个模式的目标是只有一个参数对应一个消息。我应该使用消息头来添加额外的参数吗?

4

2 回答 2

5

我想问这个问题是在迫使我思考这个问题。

我的问题的答案是这样的:

网关将 ONE 参数作为有效负载 - 其余参数转到具有自定义名称的标题字段。所以就我而言,我会这样做:

@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 有任何依赖。只有网关需要这种依赖。接线全部在弹簧配置中完成。我想我爱上了 spring-integration :-D

于 2012-09-30T06:35:52.847 回答
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)
于 2013-06-13T09:09:08.853 回答