如何使用doCatch在Apache Camel中发生错误后移动文件

时间:2014-09-22 17:10:03

标签: java xml apache-camel

任何人都可以在这个关于apache camel的问题上帮助我吗? 我正在尝试执行一条行为如下的路线:

  1. 将XML存档发送到Webservice
  2. 如果响应正常,请将此文件移至名为的目录 “successImport”
  3. 如果响应失败,请将此文件移动到名为的目录 “failImport”
  4. 实际问题是: 即使Web服务进程失败,Camel也会将我的文件移动到directoris,failImport和successImport。

    这是我的代码片段:

    String webservice310 = "localhost:8080/api/importxml/version310";
    String webservice200 = "localhost:8080/api/importxml/version200";
    String dir = "c:/imports/";
    
    from("file:" + dir + "?include=.*.xml&delay=1000&move=successImport")
    .process(new ProcessorXml())
    .doTry()
        .choice()
            .when(header("version").isEqualTo("3.10"))
                .to("restlet:"+ webservice310 + "?restletMethod=post")
            .when(header("version").isEqualTo("2.00"))
                .to("restlet:"+ webservice200 + "?restletMethod=post")
    .endDoTry()
    .doCatch(XmlBindException.class)
        .to("file://" + dir + "failImport");
    

    当我改变这样的路线时:

    from("file:" + dir + "?include=.*.xml&delay=1000&move=successImport&moveFailed=failImport")
    

    Camel运行良好,但任何错误都会转到“failImport”,即使这不是我所期望的异常触发的。 如何只移动我在路由“doCatch”块中指定的异常?

2 个答案:

答案 0 :(得分:2)

您是否尝试过exception clause

您的代码看起来像

from("file:" + dir + "?include=.*.xml&delay=1000&move=successImport")
.onException(XmlBindException.class)
    .handled(true)
    .to("file://" + dir + "failImport")
.end()
.process(new ProcessorXml())
.choice()
    .when(header("version").isEqualTo("3.10"))
        .to("restlet:"+ webservice310 + "?restletMethod=post")
    .when(header("version").isEqualTo("2.00"))
        .to("restlet:"+ webservice200 + "?restletMethod=post")

但要小心,如果异常不是XmlBindException,Camel会尝试无休止地重新传递文件

答案 1 :(得分:1)

在尝试了谢尔盖的解决方案之后,我发现我可以使用以下代码实现预期的结果:

String webservice310 = "localhost:8080/api/importxml/version310";
String webservice200 = "localhost:8080/api/importxml/version200";
String dir = "c:/imports/";

from("file:" + dir + "?include=.*.xml&delay=1000&move=successImport&moveFailed=failImport")
.process(new ProcessadorNfe())
.onException(RestletOperationException.class)
    .handled(false)
    .maximumRedeliveries(-1).delay(60 * 1000)
    .end()
.choice()
    .when(header("version").isEqualTo("3.10"))
        .to("restlet:"+ webservice310 + "?restletMethod=post")
    .when(header("version").isEqualTo("2.00"))
        .to("restlet:"+ webservice200 + "?restletMethod=post")

正如您所看到的,我使用了" moveFailed"我的路线上的子句,并定制了我的.onException子句,等待服务器启动。 因此,每当服务器关闭时,camel都会等待,但是当它收到另一种异常时,它会将我的文件移动到只有我的文件到failImport文件夹。