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

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.我应该使用邮件标题添加额外的参数吗?

Chr*_*sen 5

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

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

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