Spring integration 避免异常到达先前的集成流

Spring integration 避免异常到达先前的集成流,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,我定义了两个IntegrationFlows,它们都使用这个组件。一个从ftp读取,一个从磁盘读取文件 @Bean public IntegrationFlow csvLineFlowDefinition() { return IntegrationFlows.from(CHANNEL_NAME) .filter(String.class, m -> { // filter to remove column definitio

我定义了两个IntegrationFlows,它们都使用这个组件。一个从ftp读取,一个从磁盘读取文件

@Bean
public IntegrationFlow csvLineFlowDefinition() {
    return IntegrationFlows.from(CHANNEL_NAME)
            .filter(String.class, m -> {
                // filter to remove column definition csv line
                return !m.startsWith("ID");
            })
            .<String, MyPrettyObject>transform(csvLinePayload -> {
                String[] array = csvLinePayload.split(",");

                MyPrettyObject myPrettyObject = new MyPrettyObject();
                myPrettyObject.setId(array[0]);
                myPrettyObject.setType(array[1]);

                return myPrettyObject;
            })
            .<MyPrettyObject, String>route(myPrettyObject -> myPrettyObject.getType(),
                    routeResult -> routeResult
                            .channelMapping("AA", "AA_CHANNEL")
                            .channelMapping("BB", "BB_CHANNEL")
                            .channelMapping("CC", "CC_CHANNEL"))
            .get();
}
@Bean
公共集成流csvLineFlowDefinition(){
返回IntegrationFlows.from(通道名称)
.filter(String.class,m->{
//用于删除列定义csv行的筛选器
return!m.startsWith(“ID”);
})
.transform(csvLinePayload->{
字符串[]数组=csvLinePayload.split(“,”);
MyPrettyObject MyPrettyObject=新的MyPrettyObject();
setId(数组[0]);
setType(数组[1]);
返回myPrettyObject;
})
.route(myPrettyObject->myPrettyObject.getType(),
路由结果->路由结果
.频道映射(“AA”、“AA_频道”)
.信道映射(“BB”、“BB_信道”)
.channelMapping(“CC”、“CC_频道”))
.get();
}
如果从ftp读取或从磁盘读取文件有问题,我希望这两个集成流只能失败。 它们定义了自己的错误通道。 我不希望csv行到MyPrettyObject的转换中出现错误,从而达到这两个集成流

我考虑过将原始csv行分派到消息队列,然后可以在该消息队列的入站使用者上定义特定的错误通道

然而,这似乎有点矫枉过正

我已尝试为转换器插入ExpressionEvaluationRequestHandlerAdvice,但我不确定如何正确使用它,并且消息未到达路由器或错误通道名称

@Bean
public ExpressionEvaluatingRequestHandlerAdvice csvLineTransformerAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice expressionEvaluatingRequestHandlerAdvice = new ExpressionEvaluatingRequestHandlerAdvice();
    expressionEvaluatingRequestHandlerAdvice.setFailureChannelName(ERROR_CHANNEL_NAME);
    expressionEvaluatingRequestHandlerAdvice.setTrapException(true);
    return expressionEvaluatingRequestHandlerAdvice;
}

.<String, MyPrettyObject>transform(csvLinePayload -> {
                String[] array = csvLinePayload.split(",");

                MyPrettyObject myPrettyObject = new MyPrettyObject();
                myPrettyObject.setId(array[0]);
                myPrettyObject.setType(array[1]);

                return myPrettyObject;
            }, t -> t.advice(csvLineTransformerAdvice()))
@Bean
公共表达式评估请求HandlerAdvice CSVLineTransformerDevice(){
expressionEvaluationRequestHandlerAdvice expressionEvaluationRequestHandlerAdvice=新表达式EvaluationRequestHandlerAdvice();
expressionEvaluationRequestHandlerAdvice.setFailureChannelName(错误\通道\名称);
表达式evaluationRequestHandlerAdvice.setTrapException(true);
返回表达式EvaluationRequestHandlerAdvice;
}
.transform(csvLinePayload->{
字符串[]数组=csvLinePayload.split(“,”);
MyPrettyObject MyPrettyObject=新的MyPrettyObject();
setId(数组[0]);
setType(数组[1]);
返回myPrettyObject;
},t->t.advice(csvLineTransformerAdvice())
我担心“阅读有问题”没有到达错误频道,因为还没有要处理的消息。因此,将入站通道适配器与流的其余部分隔离可能不是一个好主意。这对于任何下游错误传播到入站通道适配器上的错误通道来说都是很正常的

表达式evaluation requestHandlerAdvice
是正确的选择,但您应该记住,它只适用于
转换器。下游流量还没有包含在该建议中


如果出现错误,流将停止,并且由于错误而无法到达下一个端点。不确定您的担忧是什么…

我不相信csv行包含正确数量的字段,也不相信我能正确解析它们(在transformer中)。对不起,我的例子没有说明这一点。我的目标是始终成功地读取整个文件,然后分别处理每一行。如果一条线的转换失败,则将其发送到日志流。如果没有,请继续连接路由器。也许我应该在transformer中尝试捕获并返回成功或错误消息。然后根据这个结果路由?考虑使用<代码>文件生成器< /> >,并在该转换器上留下相同的<代码>表达式计算ReQuththand Lead建议< /代码>。但是您的转换器应该已经处理了一行代码:在前面的步骤中,我有一个文件拆分器,它也可以读取文件,但是我将尝试在该步骤中使用ExpressionEvaluationRequestHandlerAdvice:-)在文件拆分器上添加ExpressionEvaluationRequestHandlerAdvice有效。非常感谢。