我们需要在两个不同的通道中处理相同的消息(有效负载)。我们的印象是,使用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并并行执行它们?你能告诉我如何做到这一点吗?
答案 0 :(得分:-1)
这是对的。 Spring Integration只是Java,在不同消息之间复制payload
没有任何魔力。它实际上只是内存中的同一个对象。现在想象一下,你有一个纯Java,并希望用相同的Foo
对象调用两个不同的方法。然后在一个方法中修改该对象。另一个会发生什么?对,它会看到对象的修改。
要确保将对象复制到新实例以实现目标,您必须自己确保它。例如,在类上实现Cloneable
接口,或者提供复制构造函数或任何其他可能的解决方案来创建新对象。
在其中一个订阅者的流程开始时,您应该执行该克隆操作,并且您将拥有一个新对象而不会影响另一个订阅者。
在此JIRA中查看更多信息:https://jira.spring.io/browse/INT-2979