骆驼,捕获错误并移动文件在不同的文件夹中

时间:2017-08-30 09:13:54

标签: apache-camel

我正在尝试做ETL工作(读取,转换,存储excel)。 这条路线工作正常:

from("file:src/data?move=processed&moveFailed=error&idempotent=true")
            .bean(ExcelTransformer.class,"process")
          .to("jpa:cie.service.receiver.DatiTelefonici?entityType=java.util.ArrayList");

但是我需要在Exception的情况下进行自定义:我需要将文件移动到其他文件夹中,然后应用:

onException(Throwable.class).maximumRedeliveries(0).to("file:src/data?move=error");

但是文件组件无法移动文件,因为第一个文件comp实例是locket。 然后我尝试使用try / catch但它不起作用(可能是catch内部的移动操作不知道正确的文件名?)

from("file:src/data?noop=true")
        .doTry()
            .bean(ExcelTransformer.class,"process")
            .to("jpa:cie.service.receiver.DatiTelefonici?entityType=java.util.ArrayList")
            .to("file:src/data?move=processed")
        .doCatch(Throwable.class)
            .to("file:src/data?move=error")
        .end();

经过多次评论后,我的当前代码如下:

from("file:src/data?noop=false&delete=true")
        .doTry()
            .bean(ExcelTransformer.class,"process")                  .to("jpa:cie.service.receiver.DatiTelefonici?entityType=java.util.ArrayList")
            .to("file:src/data/processed")
        .doCatch(Throwable.class)
            .to("file:src/data/error")
            /*
            .doFinally()
                .to("file:src/data:delete=true")
            */
        .end();

它正确处理处理和错误文件夹中的文件,但该文件仍保留在主文件夹中,并且以递归方式进行更多预处理

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么你需要从参数中删除idempotent=true,然后它应该有效:

from("file:src/data?move=processed&moveFailed=error")
          .bean(ExcelTransformer.class,"process")
          .to("jpa:cie.service.receiver.DatiTelefonici?entityType=java.util.ArrayList");

如果路由成功,则上一个路由会将文件移动到processed文件夹,否则会将文件移动到error文件夹(如果发生任何异常)。文件名不会被更改。

使用try-catch的其他解决方案

from("file://src/data?delete=true")
        .doTry()
            .bean(ExcelTransformer.class,"process")
            .to("jpa:cie.service.receiver.DatiTelefonici?entityType=java.util.ArrayList")
            .to("file://src/data/processed")
        .doCatch(Throwable.class)
            .to("file://src/data/error")
        .end();