Apache camel Camel,捕获错误并将文件移动到其他文件夹中

Apache camel Camel,捕获错误并将文件移动到其他文件夹中,apache-camel,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.ArrayLis

我正在尝试做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");
但我需要自定义以防出现异常:我需要将文件移动到其他文件夹中,然后应用:

onException(Throwable.class).maximumRedeliveries(0).to("file:src/data?move=error");
但文件组件无法移动该文件,因为它是由第一个文件组件实例锁定的。 然后我尝试使用try/catch,但它不起作用(可能catch中的移动操作不知道正确的文件名?)

坦克

经过多次注释后,我当前的代码如下所示:

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

它正确地移动了processed and error文件夹中的文件,但该文件仍保留在主文件夹中,并以递归方式进行了更多的预处理

如果我很好地理解了您的问题,那么您需要从参数中删除
幂等项=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的其他解决方案
在第二个代码中,设置noop=false。如果设置为true,则不会删除或移动文件。此外,请在第二个.to()中添加文件名。您可以将原始from()中的文件名添加到头中,并在第二个to中使用。“第二个代码”您是指一个例外(……?我可以将文件名放入头中并从头中延迟读取吗?thanksfrom(“file:src/data?noop=true”).doTry(),此处设置noop=false是,在头或exchange属性中设置文件名,并在.to()中使用它当您要移动文件时。否,已尝试。moveFailed选项参考初始移动时的错误“初始移动”是什么意思?您希望在路由过程中处理一个特定异常还是任何异常?是否有OneException()在路由中指定?仅当在移动文件时引发异常时,才会发生移动失败,正如file2组件文档中所报告的不完全一样,它
用于在处理(通过上面定义的移动配置)失败的情况下移动文件时动态设置不同的目标目录。
()因此,如果在处理过程中发生任何异常(例如,
ExcelTransformer.process
类抛出异常),它会将文件移动到指定的文件夹中。如果一切都成功,它会将文件移动到
已处理的
文件夹。是否要实现上一步或其他目标?使用doTry()、doCatch()的其他解决方案更新了我的答案。
from("file:src/data?move=processed&moveFailed=error")
          .bean(ExcelTransformer.class,"process")
          .to("jpa:cie.service.receiver.DatiTelefonici?entityType=java.util.ArrayList");
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();