骆驼窃听错误处理

Camel Wiretap Error Handling

我是 camel (v 2.10.0) 的新手,正在寻找由于我们在 wireTap() 调用的路由中抛出异常而遇到的问题。

问题:当窃听路由抛出异常时,错误处理不会 运行 这些异常。当我们将调用更改为直接 "to()" 调用时,我们就会进行适当的错误处理。根据我的理解,WireTap 还应该使用相同的 ErrorHandlerBuilder,它适用于同一 RouteBuilder class.

中的其他路由

我们有 ErrorHandlerBuilder,它是根据 camel 上下文配置的(在 OSGI 蓝图中)

<camelContext id="ourHandlerContext" trace="false" errorHandlerRef="ourErrorHandlerBuilder"
    xmlns="http://camel.apache.org/schema/blueprint">
 <routeBuilder ref="ourHandlerRouteBuilder"/>

</camelContext>

但是我们的骆驼路线在 Java ourHandlerRouteBuilder class configure() 方法中有这样的东西:

from("direct-vm:start").routeId("start")          
    .wireTap("direct-vm:wiretap_exception")
    .to("direct-vm:endroute_last");

    from("direct-vm:wiretap_exception").routeId("wiretap_exception")
    .process(new Processor() {

        @Override
        public void process(Exchange exchange) throws Exception {
            throw new Exception("I AM EXCEPTION");
        }
    })
    ;

    from("direct-vm:endroute_last").routeId("endroute_last")
    .process(new Processor() {

        @Override
        public void process(Exchange exchange) throws Exception {
            throw new Exception("I AM ALSO EXCEPTION");
        }
    })
    ;

"I AM EXCEPTION" 抛出时从未被单独捕获,但当我也抛出时 "I AM ALSO EXCEPTION" 然后我可以在 ErrorHandler 中看到它。

我们对这些异常有一些复杂的翻译器来翻译一些我认为没有必要在这里分享的 http 错误代码。

但从上述情况来看,如果有人可以分享他的想法将会有所帮助。

wireTap 运行s 是异步的,因此你迫不及待地想捕捉它的异常。如果你想同步 运行 它并等待可能的异常,你可以使用 enrich 代替。

像这样:

    .enrich("direct-vm:wiretap_exception", new AggregationStrategy() {
        @Override
        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
            return oldExchange;
        }        
    })

我也遇到了类似的问题。如果在窃听的子路由“anotherRoute”内部抛出异常,则不会执行 onException 块。在窃听路由中创建自定义错误处理的解决方案应该是什么?骆驼版本:3.1.0

from("rest:POST:/order")
  .wiretap("direct:anotherRoute");
  
from("direct:anotherRoute")
 .onException(Exception.class)
   .doErrorHandlingThings(...)
   .handled(true)
   .stop()
 .end()
 .process(dobusinessLogicNormally);

然而,当将 onException() 块放置在到全局范围的窃听路由之外时,它会正常工作。

 onException(Exception.class)
   .doErrorHandlingThings(...)
   .handled(true)
   .stop()
 .end();


from("rest:POST:/order")
  .wiretap("direct:anotherRoute");

from("direct:anotherRoute")
  .exceptionThrow()