Spring Integration DSL向两个通道发送相同的消息

时间:2017-11-02 21:26:32

标签: spring-integration eai spring-integration-dsl

我们需要在两个不同的通道中处理相同的消息(有效负载)。我们的印象是,使用PubliSHSubscribe Channel可以帮助我们通过向两个频道制作消息副本来解决这个问题。然而,我们认为每个频道都是一个接一个地执行,如果e在一个频道中对有效载荷进行任何更改,它也会影响其他频道的有效载荷。

@Bean
public IntegrationFlow bean1() {
    return IntegrationFlows
            .from("Channel1")
            .handle(MyMessage.class, (payload, header) -> obj1.method1(payload))
            .channel(MessageChannels.publishSubscribe("subscribableChannel").get())
            .get();
}


@Bean
public IntegrationFlow bean21() {
    return IntegrationFlows
            .from("subscribableChannel")
            .handle(MyMessage.class, (payload, header) -> obj2.method2(payload,header))
            .channel("nullChannel")
            .get();
}


@Bean
public IntegrationFlow bean22() {
    return IntegrationFlows
            .from("subscribableChannel")
            .handle(MyMessage.class, (payload, header) -> obj3.method3(payload))
            .channel("nullChannel")
            .get();
}

在上面的例子中,如果我对bean21中的有效负载进行了更改,则会影响传输到bean 22的输入有效负载。

我的要求是将相同的有效负载传递给bean21和bean22并并行执行它们?你能告诉我如何做到这一点吗?

1 个答案:

答案 0 :(得分:-1)

这是对的。 Spring Integration只是Java,在不同消息之间复制payload没有任何魔力。它实际上只是内存中的同一个对象。现在想象一下,你有一个纯Java,并希望用相同的Foo对象调用两个不同的方法。然后在一个方法中修改该对象。另一个会发生什么?对,它会看到对象的修改。

要确保将对象复制到新实例以实现目标,您必须自己确保它。例如,在类上实现Cloneable接口,或者提供复制构造函数或任何其他可能的解决方案来创建新对象。

在其中一个订阅者的流程开始时,您应该执行该克隆操作,并且您将拥有一个新对象而不会影响另一个订阅者。

在此JIRA中查看更多信息:https://jira.spring.io/browse/INT-2979