2

我们有一个要求,我需要在两个不同的渠道中处理相同的消息(有效负载)。我们的印象是,使用 PubliSHSubscribe 频道将通过将消息复制到两个频道来帮助我们处理这个问题。然而,我们认为每个通道一个接一个地执行,如果 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 并并行执行它们?你能告诉我如何做到这一点吗?

4

1 回答 1

0

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

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

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

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

于 2017-11-02T22:32:46.387 回答