【发布时间】:2018-07-31 20:19:42
【问题描述】:
我正在尝试添加过滤器以丢弃流程并在失败后继续执行主要流程并聚合拆分器。错误和成功的预期类型相同。没有特定的聚合器逻辑。
@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();
这将有条件地跳过并继续流程。
【问题讨论】:
标签: spring-integration spring-integration-dsl