マルチキャスト + アグリゲーションについて、次の奇妙な (または少なくとも私には不明な) 動作があります。次のルートを検討してください。
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:A
andに送信しdirect:B
、これら 2 つのエンドポイントからのリストを期待してそれらを連結します (最後の行のコメントは後で説明する理由でそこにあります)。
ここで、これら 2 つのエンドポイントがそれぞれリスト [A] と [B] を「返す」と仮定します。にメッセージを送信するM
とdirect:multicaster
、アグリゲーターは and で一度呼び出されoldExchange = null
、newExchange.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()
どちらも同じ動作になります。
ここで何が起こっているのですか - 何を間違えたのですか?
前もってありがとう