Camel窃听错误处理

时间:2015-05-20 13:52:45

标签: java apache-camel

我是camel(v 2.10.0)的新手并且正在搜索由于我们在由wireTap()调用的路由中抛出异常而导致的问题。

问题:当从窃听路由引发异常时,不会针对这些异常运行错误处理。当我们将调用更改为直接“to()”调用时,我们会有适当的错误处理。根据我的理解,WireTap也应该使用相同的ErrorHandlerBuilder,它适用于同一个RouteBuilder类中的其他路由。

我们有我们的ErrorHandlerBuilder,它按照驼峰上下文配置为(在OSGI蓝图中)

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

</camelContext>

但我们的camel路由是在Java中我们的HandlerRouteBuilder类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");
        }
    })
    ;

“我异常”在投掷时从未被单独捕获,但当我也抛出“我也是异常”时,我可以在ErrorHandler中看到它。

我们有一些针对这些例外的复杂翻译器转换为一些我认为不必在此分享的http错误代码。

但是从上面的情况来看,如果某个机构可以分享他的想法将会有所帮助。

2 个答案:

答案 0 :(得分:0)

wireTap以异步方式运行,因此您无法等待捕获其异常。如果要同步运行它并等待可能的异常,可以使用enrich代替。

这样的事情:

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

答案 1 :(得分:0)

我也遇到了类似的问题。如果在窃听的子路由“ 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()