3

マルチキャスト + アグリゲーションについて、次の奇妙な (または少なくとも私には不明な) 動作があります。次のルートを検討してください。

    from("direct:multicaster")
                .multicast()
                .to("direct:A", "direct:B")
                .aggregationStrategy(new AggregationStrategy() {
                    @Override
                    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
                        if (oldExchange == null) {
                            List firstResult = newExchange.getIn().getBody(List.class);
                            newExchange.getIn().setBody(ImmutableList.copyOf(firstResult));
                            return newExchange;
                        } else {
                            List oldResults = oldExchange.getIn().getBody(List.class);
                            List newResults = newExchange.getIn().getBody(List.class);
                            ImmutableList aggResult = ImmutableList.copyOf(Iterables.concat(oldResults, newResults));
                            oldExchange.getIn().setBody(aggResult);
                            return oldExchange;
                        }
                    }
                })
                .end()
//                .to("log:bla")

基本的に、このルートは入力を受け取り、それをdirect:Aandに送信しdirect:B、これら 2 つのエンドポイントからのリストを期待してそれらを連結します (最後の行のコメントは後で説明する理由でそこにあります)。

ここで、これら 2 つのエンドポイントがそれぞれリスト [A] と [B] を「返す」と仮定します。にメッセージを送信するMdirect:multicaster、アグリゲーターは and で一度呼び出されoldExchange = nullnewExchange.in.body=[A]次にoldExchange.in.body=[A]andで呼び出さnewExchange.out.body=[B]れます (本来の動作です)。

この時点まではすべて順調です。oldExchange.in.body=[A,B]しかし、アグリゲーターはand newExchange.in=M(Mが最初のメッセージ) でもう一度呼び出されます。これは、含まれているエンリッチメント パターンに似ています。

最後の行のコメントを削除することで、期待される動作を得ることができます。つまり、単純にダミーを追加しto("log:bla")ます。これにより、すべてが期待どおりに動作します。

更新: 試行中 (Claus が提供するヒントを参照)

            .multicast()
            .aggregationStrategy(aggStrategy)
            .to("direct:A", "direct:B")
            .end()

            .multicast(aggStrategy)
            .to("direct:A", "direct:B")
            .end()

どちらも同じ動作になります。

ここで何が起こっているのですか - 何を間違えたのですか?

前もってありがとう

4

3 に答える 3

0

私も同じ問題を抱えていました。2つのことが重要と思われる

  • 前にAggregationStrategyを設定します(マルチキャストのパラメーターとして直接設定します)
  • 「end()」でマルチキャストを終了する

各ノードの戻り値の型を見れば違いがわかると思います

于 2016-11-04T11:59:51.983 に答える