【问题标题】:Spring Integration DSL Same message to both channelsSpring Integration DSL 向两个通道发送相同的消息
【发布时间】:2018-04-15 13:04:09
【问题描述】:

我们有一个要求,我需要在两个不同的渠道中处理相同的消息(有效负载)。我们的印象是,使用 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 并并行执行它们?你能告诉我如何做到这一点吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多