Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态调用Spring集成转换器_Java_Spring_Spring Mvc_Dependency Injection_Spring Integration - Fatal编程技术网

Java 动态调用Spring集成转换器

Java 动态调用Spring集成转换器,java,spring,spring-mvc,dependency-injection,spring-integration,Java,Spring,Spring Mvc,Dependency Injection,Spring Integration,我是Spring集成的新手,正在从事SI项目。我正在做一个简单的工作,从一个通道(来自适配器)获取消息,调用一个转换器并将输出发送到另一个通道(toQueue)。以下代码用于SI配置文件---- 然而,现在我有一个稍微复杂的需求。根据消息的某些值,我希望将消息发送到6个变压器中的任意一个,而不是总是将消息发送到一个变压器。如何实现这一点?您可以将这6个转换器声明为单个点对点通道的订户,默认情况下,它将使用循环调度策略(它将仅为每条消息调用单个转换器,但它将始终选择列表中的下一个转换器,然后循

我是Spring集成的新手,正在从事SI项目。我正在做一个简单的工作,从一个通道(来自适配器)获取消息,调用一个转换器并将输出发送到另一个通道(toQueue)。以下代码用于SI配置文件----



然而,现在我有一个稍微复杂的需求。根据消息的某些值,我希望将消息发送到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>