拆分中的Spring集成验证&总流量

时间:2018-02-21 09:48:38

标签: spring-integration spring-integration-dsl

我正在尝试添加过滤器以丢弃流,并在失败后继续执行主流并聚合分割器。错误和预期的类型成功是一样的。没有特定的聚合器逻辑。

@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();

这将进行条件跳过&继续流动。

1 个答案:

答案 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())生成正确的答复。