spring : 为路由器添加参数
spring : adding params for router
我正在使用 spring 路由器来决定通过 2 个通道中的哪一个。
我不想将有效负载中的值之一而不是有效负载本身传递给返回答案的服务。我怎样才能做到这一点?我并没有真正找到这样的用例,我想也许可以通过使用 enricher 来完成。有什么建议吗?
我的代码:
<int:router id="aggregationRouter"
input-channel="aggregationPathRouterInputChannel"
ref="decideAggregationByName"
>
<int:mapping value="true" channel="SumAggregatorChannel" />
<int:mapping value="false" channel="AvgAggregatorChannel"/>
</int:router>
decideAggregationByName 得到一个输入,它是一个字符串(名称)和 returns 一个布尔值。
我不知道如何传递我在此步骤中获得的有效负载中的成员字符串参数
大多数 Spring 集成组件提供了一个 expression
选项,这与 ref
和 method
相矛盾。因此,如果您的 payload
是 Map
(例如),但您的 decideAggregationByName
需要 String
作为参数并且您知道哪个 key
代表 value
对于那个 arg 你可以这样做:
<int:router id="aggregationRouter"
input-channel="aggregationPathRouterInputChannel"
expression="@decideAggregationByName.doDecision(payload['key'])"
>
从另一方面,您可以修改该目标方法以接受整个 payload
对象并从代码中手动提取所需的 String
。
否则我不确定你面前的问题是什么。
试试这个方法。我们可以用表达式来决定频道:
<int:router input-channel="aggregationPathRouterInputChannel"
expression="payload ? 'SumAggregatorChannel' : 'AvgAggregatorChannel'" />
如果我没记错的话,你想要实现的是,select 相应的通道基于有效负载中的某些键,然后仅将有效负载的那部分而不是完整的有效负载传递给服务。
bilan 的解决方案仍将传递完整的有效负载,然后在您的服务端您仍然必须取出该值(这听起来不是一个好的模式,因为这不是您的服务方法工作。)
我的建议是:
第 1 步:编写一个拆分器,您将在其中为有效负载中的不同值创建 MessageObjects 列表。
public List<Message<?>> spitPayload(your payload) {
List<Message<?>> result = new ArrayList<Message<?>>();
final Message<?> message1 = MessageBuilder
.withPayload("values from payload for sum")
.setHeader('routerId',
"sum").build();
final Message<?> message2 = MessageBuilder
.withPayload("values from payload for avg")
.setHeader('routerId',
"avg").build();
result.add(message1);result.add(message2);
return message;
}
Step2:Router根据Paylod Key判断对应的频道
<si:header-value-router header-name="routerid"
input-channel="aggregationPathRouterInputChannel">
<si:mapping value="sum" channel="sumchannel" />
<si:mapping value="avg" channel="avgchannel" />
</si:header-value-router>
一旦密钥匹配,只有有效载荷的所需部分将被传输到通道端点。
我正在使用 spring 路由器来决定通过 2 个通道中的哪一个。 我不想将有效负载中的值之一而不是有效负载本身传递给返回答案的服务。我怎样才能做到这一点?我并没有真正找到这样的用例,我想也许可以通过使用 enricher 来完成。有什么建议吗?
我的代码:
<int:router id="aggregationRouter"
input-channel="aggregationPathRouterInputChannel"
ref="decideAggregationByName"
>
<int:mapping value="true" channel="SumAggregatorChannel" />
<int:mapping value="false" channel="AvgAggregatorChannel"/>
</int:router>
decideAggregationByName 得到一个输入,它是一个字符串(名称)和 returns 一个布尔值。 我不知道如何传递我在此步骤中获得的有效负载中的成员字符串参数
大多数 Spring 集成组件提供了一个 expression
选项,这与 ref
和 method
相矛盾。因此,如果您的 payload
是 Map
(例如),但您的 decideAggregationByName
需要 String
作为参数并且您知道哪个 key
代表 value
对于那个 arg 你可以这样做:
<int:router id="aggregationRouter"
input-channel="aggregationPathRouterInputChannel"
expression="@decideAggregationByName.doDecision(payload['key'])"
>
从另一方面,您可以修改该目标方法以接受整个 payload
对象并从代码中手动提取所需的 String
。
否则我不确定你面前的问题是什么。
试试这个方法。我们可以用表达式来决定频道:
<int:router input-channel="aggregationPathRouterInputChannel"
expression="payload ? 'SumAggregatorChannel' : 'AvgAggregatorChannel'" />
如果我没记错的话,你想要实现的是,select 相应的通道基于有效负载中的某些键,然后仅将有效负载的那部分而不是完整的有效负载传递给服务。 bilan 的解决方案仍将传递完整的有效负载,然后在您的服务端您仍然必须取出该值(这听起来不是一个好的模式,因为这不是您的服务方法工作。) 我的建议是: 第 1 步:编写一个拆分器,您将在其中为有效负载中的不同值创建 MessageObjects 列表。
public List<Message<?>> spitPayload(your payload) {
List<Message<?>> result = new ArrayList<Message<?>>();
final Message<?> message1 = MessageBuilder
.withPayload("values from payload for sum")
.setHeader('routerId',
"sum").build();
final Message<?> message2 = MessageBuilder
.withPayload("values from payload for avg")
.setHeader('routerId',
"avg").build();
result.add(message1);result.add(message2);
return message;
}
Step2:Router根据Paylod Key判断对应的频道
<si:header-value-router header-name="routerid"
input-channel="aggregationPathRouterInputChannel">
<si:mapping value="sum" channel="sumchannel" />
<si:mapping value="avg" channel="avgchannel" />
</si:header-value-router>
一旦密钥匹配,只有有效载荷的所需部分将被传输到通道端点。