Chr*_*sen 3 parameters gateway spring-integration
我有一个关于网关和多个参数的问题:
上下文: 我希望Gateway有两种方法:
search(Query query, FetchSpec fetchSpec);
search(int queryId, FetchSpec fetchSpec);
Run Code Online (Sandbox Code Playgroud)
第一种方法应该直接路由到执行查询的服务,而第二种方法应该路由到另一个服务以将queryId解析为Query,然后转到第一个Service以执行Query.
问题:将两个(或更多)参数作为Gateway方法的参数,最佳做法是什么?似乎整个模式的目标是只有一个参数对应一个Message.我应该使用邮件标题添加额外的参数吗?
我想问这个问题迫使我想一想这个问题.
我的问题的答案是这样的:
Gateway只接受一个参数作为Payload - 其余参数带有自定义名称的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);
Run Code Online (Sandbox Code Playgroud)
我定义哪些参数是有效负载,哪些是头.然后每个方法将其消息定向到特定通道以进行服务激活.
在配置中我定义我的网关如下:
<int:gateway service-interface="my.company.search.Search" />
Run Code Online (Sandbox Code Playgroud)
然后我为每个网关方法激活一个特定配置的搜索服务:
<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'])"/>
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我像这样设计我的经理:
public ResultSet fetchById(int queryId, FetchSpec fetchSpec) {...}
public ResultSet fetchByQuery(Query query, FetchSpec fetchSpec) {...}
Run Code Online (Sandbox Code Playgroud)
我发现这个解决方案非常优雅,因为我不需要在我的服务中对Spring有任何依赖.只有网关需要具有此依赖关系.接线全部在弹簧配置中完成.我想我爱上了春天的融合:-D