有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java动态调用Spring集成转换器

我是Spring integration的新手,正在从事一个SI项目。我正在做一个简单的工作,从一个通道(来自适配器)获取消息,调用一个转换器,并将输出发送到另一个通道(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个变压器中的任意一个,而不是总是将消息发送到一个变压器。如何实现这一点


共 (1) 个答案

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