Java 动态调用Spring集成转换器
我是Spring集成的新手,正在从事SI项目。我正在做一个简单的工作,从一个通道(来自适配器)获取消息,调用一个转换器并将输出发送到另一个通道(toQueue)。以下代码用于SI配置文件----Java 动态调用Spring集成转换器,java,spring,spring-mvc,dependency-injection,spring-integration,Java,Spring,Spring Mvc,Dependency Injection,Spring Integration,我是Spring集成的新手,正在从事SI项目。我正在做一个简单的工作,从一个通道(来自适配器)获取消息,调用一个转换器并将输出发送到另一个通道(toQueue)。以下代码用于SI配置文件---- 然而,现在我有一个稍微复杂的需求。根据消息的某些值,我希望将消息发送到6个变压器中的任意一个,而不是总是将消息发送到一个变压器。如何实现这一点?您可以将这6个转换器声明为单个点对点通道的订户,默认情况下,它将使用循环调度策略(它将仅为每条消息调用单个转换器,但它将始终选择列表中的下一个转换器,然后循
然而,现在我有一个稍微复杂的需求。根据消息的某些值,我希望将消息发送到6个变压器中的任意一个,而不是总是将消息发送到一个变压器。如何实现这一点?您可以将这6个转换器声明为单个点对点通道的订户,默认情况下,它将使用循环调度策略(它将仅为每条消息调用单个转换器,但它将始终选择列表中的下一个转换器,然后循环) 在您的情况下,您应该简单地声明所有这些变压器使用完全相同的输入和输出通道,并且上述情况将自动发生
要根据邮件的某些属性选择转换器,您可以使用
收件人列表路由器
,并为列表中的每个收件人
定义一个选择器表达式
,以匹配特定类型的邮件。此外,对于每个收件人,您应该使用不同的频道名称。然后,这些通道中的每一个将被用作所需变压器的输入:
<recipient-list-router input-channel="fromAdapter" default-output-channel="toQueue">
<recipient channel="t1" selector-expression="payload.someFlag"/>
<recipient channel="t2" selector-expression="headers.someOtherFlag"/>
</recipient-list-router>
<transformer input-channel="t1" ref="transformer1" method="transform"/>
<transformer input-channel="t2" ref="transformer2" method="transform"/>
请记住,使用这种方法,消息可以匹配多个选择器表达式,因此由您提供互斥表达式
或者,如果您愿意编写一些基础架构代码,您可以编写自己的
LoadBalancingStrategy
实现,并将其提供给点对点通道。然后,您的策略将负责为每条消息选择正确的处理程序。收件人列表路由器将工作,如果您想将消息发送到多个转换器,则可能是合适的,但如果不这样做,则必须小心使选择器表达式互斥。也许更简单的路由器可能更合适。例如
<header-value-router input-channel="routingChannel" header-name="foo">
<mapping value="1" channel="channel1" />
<mapping value="2" channel="channel2" />
</header-value-router>
或
我认为您为这个问题选择的一些标签具有误导性:“依赖注入”。。。可能是;但是“SpringMVC”或“java”--我看不出来。不,我不这么认为,我在java和CoreSpring中与SI合作,所以最好包括CoreSpring和java受众。谢谢你的回答。但这并不能完全解决问题。我不想使用循环策略。我想根据消息中的某个值执行转换器路由。例如,对于字段国家设置为USA的所有邮件,我希望调用USATransformer;对于字段国家设置为France的所有邮件,我希望调用FranceTransformer,依此类推。可能吗?我一定跳过了“基于某个值…”并跳到了“…到6个变压器中的任何一个”:)我将编辑我的答案。嗨,科斯蒂。谢谢你的支持。如果您能编辑您对此的答案,我们将不胜感激…-:)刚刚做了。。。让我知道这对你是否有效,因为。。。未经测试的种类:)
<header-value-router input-channel="routingChannel" header-name="foo">
<mapping value="1" channel="channel1" />
<mapping value="2" channel="channel2" />
</header-value-router>
<router id="spelRouter" input-channel="expressionRouter"
expression="payload.someProperty"
default-output-channel="defaultChannelForExpression"
resolution-required="false">
<mapping value="foo" channel="fooChannelForExpression"/>
<mapping value="bar" channel="barChannelForExpression"/>
</router>