フィルターを追加してフローを破棄し、障害後もメイン フローを実行し続け、スプリッターを集約しようとしています。エラーと成功の両方の予想されるタイプは同じです。特定のアグリゲーター ロジックはありません。
@Bean
public IntegrationFlow flow() {
return f -> f
.split(Orders.class, Orders::getItems)
.enrich(e -> e.requestChannel("enrichChannel"))
.filter(Order.class, c -> c.getId() > 10 ? true : false,
e -> e.discardChannel(validationError()))
.handle(new MyHandler())
.transform(new MapToObjectTransformer(Order.class))
.enrich(e -> e.requestChannel("transformChannel"))
.filter(Order.class, c -> c.getTotal() > 100 ? true : false,
e -> e.discardChannel(validationError())).handle( new transformer())
.aggregate();
}
@Bean
public IntegrationFlow validationErrorFlow() {
return IntegrationFlows.from(validationError())
.handle(new ValidationHandler())
.get();
}
破棄チャネルは、分割内の次の項目を実行するためにメイン フローに戻っていません。
ルートとサブフローのマッピングを記述できますが、フィルターを使用してこれを解決しようとするルート -> サブフロー -> ルート -> サブフローで入れ子になりすぎます。検証を実行し、フロー内のすべてのアイテムの分割を続行するためのより良い方法はありますか?
更新 1:
.handle(request.class, (p, h) -> validator.validate(p)
.gateway("filterFlow.input")
.handle(new MyHandler())
.enrich(...)
.handle(...)
.enrich(...)
.handle(...)
.enrich(...)
.handle(...)
.aggregate();
@Bean
public IntegrationFlow filterFlow() {
return f -> f
.filter(response.class, c -> c.isValidationStatus(), df -> df.discardFlow
(flow -> flow.handle(Message.class, (p, h) -> p.getPayload())));
}
ゲートウェイはリクエストをインターセプトできますが.handle(new MyHandler())
、次のアイテムではなくフローが実行されましたsplit()
更新 2: (回答) Artem から
.handle(request.class, (p, h) -> validator.validate(p))
.filter(response.class,p -> p.isValidationStatus(), f -> f.discardChannel("aggregatorChannel"))
.handle(new MyHandler())
.enrich(...)
.handle(...)
.enrich(...)
.handle(...)
.enrich(...)
.handle(...)
.channel("aggregatorChannel")
.aggregate();
これにより、条件付きスキップが行われ、フローが続行されます。