我正在尝试添加过滤器以丢弃流,并在失败后继续执行主流并聚合分割器。错误和预期的类型成功是一样的。没有特定的聚合器逻辑。
@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();
这将进行条件跳过&继续流动。
答案 0 :(得分:0)
丢弃通道未加入回主流以执行拆分中的下一个项目。
这是真的。这就是它的设计方式。在大多数情况下,丢弃流程类似于JMS中的死信队列。所以,这是短暂的单向分支。
如果您真的想回到主流程,则应考虑在流程定义中使用命名通道。我的意思是在你想要在补偿(丢弃)流程后回来的地方:
.filter(Order.class, c -> c.getId() > 10 ? true : false,
e -> e.discardFlow(sf -> sf
.gateway(validationError())
.channel("myHandleChannel")))
.channel("myHandleChannel")
.handle(new MyHandler())
我使用gateway()
因为我们需要丢弃流程的回复才能继续处理。我们在子流程结束时需要.channel("myHandleChannel")
,因为丢弃流是一个分支。
使用主流上的.gateway()
可以实现另一种方法:
.gateway("filterFlow.input")
.handle(new MyHandler())
...
@Bean
public IntegrationFlow filterFlow() {
return f -> f
.filter(Order.class, c -> c.getId() > 10 ? true : false,
e -> e.discardChannel(validationError()));
}
我们向discardChannel
发送相同的请求消息,因此上述网关的正确replyChannel
标头仍然存在。只有您需要的是确保从.handle(new ValidationHandler())
生成正确的答复。