Spring Integration を利用したプロジェクトでは、データをさまざまなトランスフォーマーに送信するためのスプリッターとペイロード ルーターがあります。次に、新しい「変換された」オブジェクトがアグリゲーターに戻されて処理されます。
オブジェクトの一部を別のアウトバウンドチャネルアダプターにルーティングする必要があるため、集計結果を分割して適切に永続化したいと考えています。これを実現するために、アグリゲーターの後に 2 つ目のスプリッターを追加しました。しかし、集約されたコレクションの最初の要素だけがルーターに渡されるようです。
これは私の現在の流れです:
<splitter ref="articleContentExtractor" />
<!-- This router works exactly as expected -->
<payload-type-router>
... routing to various transformers ...
... results are sent to articleOutAggregateChannel ...
</payload-type-router>
<aggregator ref="articleAggregator" />
<splitter />
<!-- This is where it seems to go wrong, the second
splitter returns only the first object in the collection -->
<payload-type-router resolution-required="true">
<mapping type="x.y.z.AbstractContent" channel="contentOutChannel" />
<mapping type="x.y.z.Staff" channel="staffOutChannel" />
</payload-type-router>
<outbound-channel-adapter id="contentSaveService" ref="contentExporter"
method="persist" channel="contentOutChannel" />
<outbound-channel-adapter id="staffSaveService" ref="staffExporter"
method="persist" channel="staffOutChannel" />
そして私のアグリゲーターコード:
@Aggregator
public List<? super BaseObject> compileArticle(List<? super BaseObject> parts) {
// Search for the required objects for referencing
Iterator<? super BaseObject> it = parts.iterator();
Article article = null;
List<Staff> authors = new ArrayList<Staff>();
while (it.hasNext()) {
Object part = it.next();
if (part instanceof Article) {
article = (Article)part;
}
else if (part instanceof Staff) {
authors.add((Staff)part);
}
}
// Apply references
article.setAuthors(authors);
return parts;
}
私は何を間違っていますか?アグリゲーターを適切に使用していますか?
注: アグリゲーターと 2 番目のスプリッターの両方を完全に削除すると、残りのフローは完全に機能します。