1

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

<int:channel id="fromAdapter"></int:channel>
<int:channel id="toQueue">  
</int:channel>  
<bean id="trans" class="src.MyTransformer"></bean>  
<int:transformer input-channel="fromAdapter" output-channel="toQueue" ref="trans"></int:transformer>

但是,现在我有一个稍微复杂的要求。基于消息的某些值,我不想总是将消息发送到一个转换器,而是将消息发送到 6 个转换器中的任何一个。如何实施?

4

2 回答 2

1

您可以将这 6 个转换器声明为单个点对点通道的订阅者,默认情况下它将使用循环调度策略(它只会为每条消息调用一个转换器,但它总是会选择列表然后循环)。

在您的情况下,您应该简单地声明所有这些转换器使用完全相同的输入和输出通道,以上将自动发生。


要根据消息的某些属性选择转换器,您可以使用 a并为列表中的每个recipient-list-router定义 a以匹配特定类型的消息。此外,对于每个收件人,您应该使用不同的频道名称。然后这些通道中的每一个都将用作所需变压器的输入:selector-expressionrecipient

<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并将其提供给您的点对点通道。然后,您的策略将负责为每条消息选择正确的处理程序。

于 2013-01-07T08:15:10.063 回答
1

收件人列表路由器可以工作,如果您想将消息发送到多个转换器,这可能是合适的,但如果不是,您必须小心使选择器表达式互斥。也许更简单的路由器之一可能更合适。例如...

<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>
于 2013-01-07T14:37:08.903 回答