【问题标题】:Calling Spring Integration transformers dynamically动态调用 Spring Integration 转换器
【发布时间】:2013-01-07 08:09:19
【问题描述】:

我是 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 个转换器中的任何一个。如何实现?

【问题讨论】:

  • 我认为您为这个问题选择的一些标签具有误导性:“依赖注入”......可能是;但是“spring-mvc”或“java”——我看不到。
  • 不,我不这么认为,我在 java 和核心 Spring 中使用 SI,所以最好包括核心 Spring 和 Java 受众。

标签: java spring spring-mvc dependency-injection spring-integration


【解决方案1】:

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

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


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

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

【讨论】:

  • 感谢您的回答。但这并不能完全解决问题。我不想使用循环策略。我想根据消息中的某些值进行变压器路由。例如,对于字段 country 设置为 USA 的所有消息,我想调用 USATransformer,对于字段 country 设置为 France 的所有消息,我想调用 FranceTransformer 等等。有可能吗?
  • 我必须跳过“基于某个值...”并跳到“...到 6 个变压器中的任何一个”:) 我将编辑我的答案。
  • 您好 Costi..感谢您的支持。如果您能编辑您对此的答案,将不胜感激..-:)
  • 刚刚...让我知道这是否适合您,因为它...有点未经测试:)
【解决方案2】:

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

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2015-03-06
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多