2017-11-02 20 views
0

同じメッセージ(ペイロード)を2つの異なるチャネルで処理する必要があるという要件があります。 PubliSHSubscribe Channelを使用すると、両方のチャンネルにメッセージのコピーを作成することで、私たちはそれに対処することができます。しかし、私たちは、各チャンネルが次々に実行されていると考えていました。そして、あるチャンネルのペイロードに何らかの変更を加えると、他のチャンネルのペイロードにも影響します。上記の例でSpring統合DSL両方のチャネルに同じメッセージ

@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(); 
} 

iはbean21にペイロードを変更する場合、Beanに渡され、その行う入力ペイロードは22

私の要件はbean21とbean22及び実行するために同じペイロードを通過することです彼らはパラレルに?あなたはそれを達成する方法をアドバイスできますか?

答えて

0

これは間違いありません。 Springの統合は単なるJavaであり、異なるメッセージ間で​​をコピーする魔法はありません。それは実際にはメモリ内の同じオブジェクトです。あなたが純粋なJavaを持っており、同じFooオブジェクトを持つ2つの異なるメソッドを呼び出すとします。そして、1つの方法でそのオブジェクトを変更します。別のものではどうなりますか?そうですね、オブジェクトの変更が表示されます。

オブジェクトを新しいインスタンスに確実にコピーして目標を達成するには、自分で確実に行う必要があります。たとえば、クラスにCloneableインターフェイスを実装するか、またはコピーコンストラクタまたはその他の可能なソリューションを使用して新しいオブジェクトを作成します。

サブスクライバの1つのフローの始めに、クローン操作を実行して、別のサブスクライバに影響を与えることなく新しいオブジェクトを作成する必要があります。

このJIRAの詳細については、https://jira.spring.io/browse/INT-2979

関連する問題