通过Camel Resequencer传播错误

时间:2016-01-07 11:25:08

标签: apache-camel

考虑以下Camel路线:

from("file://....?moveFailed=/failed")
   .resequence(c).stream()
   .throwException(new Exception());

我希望文件使用者将处理过的文件移动到'/ failed'文件夹,因为发生了异常。事实并非如此。

由于StreamResequencer使用新线程来传递重新排序的文件(请参阅stacktrace),因此异常永远不会传播到文件使用者。

...
at org.apache.camel.processor.StreamResequencer$Delivery.run(StreamResequencer.java:262) 

我很感激如何确保错误导致文件移动失败的一些帮助/反馈?

  • 选项1:将异常传播给原始使用者。但是,我不知道如何实现这一目标。
  • 选项2:编写一个自定义的“.onException(...)”,用于手动移动文件,而不是依赖文件使用者来执行此操作。
  • 也许还有另一种更正确的方法来设置我没想到的路线?

1 个答案:

答案 0 :(得分:0)

我们使用选项2,因为选项1不可行。事实证明它工作得很好,代码仍然清晰。我们按如下方式重新修改了这条路线:

onException(Exception.class)
  .handled(true)
  .to("direct:moveFile");

from("file://....")
  .setProperty("originalContent", body())
  .resequence(c).stream()
  .to("businessLogicHere")
  .to("direct:moveFile");

from("direct:moveFile")
  .choice()
    .when(property(Exchange.EXCEPTION_CAUGHT).isNull())
       .setBody(property("originalContent")
       .setHeader(Exchange.FILE_NAME, simple("success/${file:onlyname}")
       .to("file://...")
    .otherwise()
       .setBody(property("originalContent")
       .setHeader(Exchange.FILE_NAME, simple("failure/${file:onlyname}")
       .to("file://...")