java - 如何使用 doCatch 在 Apache Camel 中出错后移动文件

标签 java xml apache-camel

谁能帮我解决这个关于 apache camel 的问题? 我正在尝试执行如下所示的路线:

  1. 将 XML 存档发送到 Web 服务
  2. 如果响应正常,将此文件移动到名为 “成功导入”
  3. 如果响应失败,将同一个文件移动到名为 “导入失败”

实际问题是: Camel 正在将我的文件移动到两个目录,failImport 和 successImport,即使 web 服务进程失败也是如此。

这是我的代码片段:

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” block 上指定的异常?

最佳答案

你试过了吗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 会不断尝试重新传递文件

关于java - 如何使用 doCatch 在 Apache Camel 中出错后移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25979533/

相关文章:

java - 使用java api与USB驱动器交互

java - 帮助重构 : Introduce Parameter Object?

c++ - 如何使boost ptree以相同的方式解析xml和json?

java - 是否可以使用 JAXB 根​​据某些属性值获取 XML 元素?

java - Apache Camel FTP 在轮询时使用 Simple 来选择目录

java - 如何创建实现接口(interface)的抽象类对象(JAVA)

java - 无法在 NIO 中获取输出

mysql - 使用 MySQL 提取值

java - 使用 apache Camel 监听 S3 存储桶中的多个文件

java - 为什么运行 Camel 示例需要在主线程上 hibernate