我对网关和多个参数有疑问:
上下文: 我希望Gateway有两种方法:
search(Query query, FetchSpec fetchSpec);
search(int queryId, FetchSpec fetchSpec);
第一种方法应该直接路由到执行查询的服务,而第二种方法应该路由到另一个服务以将queryId解析为Query,然后转到第一个Service以执行查询。
问题:将两个(或更多)参数作为Gateway方法的参数,最佳做法是什么?似乎整个模式的目标是只有一个参数对应一个Message。我应该使用邮件标题添加额外的参数吗?
答案 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)