我有一个关于网关和多个参数的问题:
上下文:
我希望网关有两种方法:
search(Query query, FetchSpec fetchSpec);
search(int queryId, FetchSpec fetchSpec);
第一种方法应该直接路由到执行查询的服务,而第二种方法应该路由到另一个服务以将 queryId 解析为查询,然后再路由到第一个服务以执行查询。
问题 :将两个(或更多)参数作为网关方法的参数的最佳实践是什么?似乎整个模式的目标是只有一个参数对应一个消息。我应该使用消息头来添加额外的参数吗?
最佳答案
我想提出这个问题是在迫使我思考这个问题。
我的问题的答案是这样的:
网关仅将一个参数作为有效负载 - 其余部分转到具有自定义名称的标题字段。所以就我而言,我会这样做:
@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);
我定义了哪些参数是有效载荷,哪些是 header 。然后每个方法将其消息定向到特定 channel 以进行服务激活。
在配置中,我像这样定义网关:
<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'])"/>
这样,我这样设计我的 Manager:
public ResultSet fetchById(int queryId, FetchSpec fetchSpec) {...}
public ResultSet fetchByQuery(Query query, FetchSpec fetchSpec) {...}
我发现这个解决方案非常优雅,因为我的服务中不必对 Spring 有任何依赖。只有网关需要有这种依赖性。接线全部在 Spring 配置中完成。我想我爱上了 spring-integration :-D
关于parameters - 具有多个参数的 Spring 集成网关方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12659008/