骆驼多播异常传播
Camel Multicast Exception Propagation
在多播中抛出异常时,Camel 不会传播异常。
给定以下设置,其中 direct:route
从其 beanRef 中抛出异常:
rest("/...")
.post()
.consumes("application/json")
.produces("application/json")
.route()
.onException(Exception.class)
.handled(true)
.bean("exceptionHandler")
.marshal("exceptionDataFormat")
.end()
.unmarshal("dataFormat")
...
.enrich("direct:services", new ServiceAggregator())
.to("direct:anotherRoute")
...
.end()
.endRest();
from("direct:services")
.errorHandler(noErrorHandler())
.multicast()
.setAggregationStrategy(new GroupedExchangeAggregationStrategy())
.executorServiceRef("executor")
.parallelAggregate()
.streaming()
.stopOnException()
.to("direct:route")
.end()
.end();
from("direct:route")
.errorHandler(noErrorHandler())
.bean("someRef", "someMethod")
.end();
我没有让异常处理程序使用交换并处理错误,而是立即返回了以下异常(到 SoapUI):
org.apache.camel.CamelExchangeException: Parallel processing failed for number 0. Exchange[...] at org.apache.camel.processor.MulticastProcessor.call(MulticastProcessor.java:328)
at org.apache.camel.processor.MulticastProcessor.call(MulticastProcessor.java:299)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
并且父路由以该异常结束并且没有异常处理。
如果 direct:anotherRoute
抛出异常,则该异常得到正确处理。
为什么我不能将多播异常传播到父路由?
骆驼 2.17-SNAPSHOT
开启多播的shareUnitOfWork
选项。查看更多详细信息:http://camel.apache.org/multicast and there is an example on the splitter which also has this option: http://camel.apache.org/splitter.html
尝试使用
.errorHandler(noErrorHandler())
在将异常传播到 onexception()
的父路由和子路由中
在多播中抛出异常时,Camel 不会传播异常。
给定以下设置,其中 direct:route
从其 beanRef 中抛出异常:
rest("/...")
.post()
.consumes("application/json")
.produces("application/json")
.route()
.onException(Exception.class)
.handled(true)
.bean("exceptionHandler")
.marshal("exceptionDataFormat")
.end()
.unmarshal("dataFormat")
...
.enrich("direct:services", new ServiceAggregator())
.to("direct:anotherRoute")
...
.end()
.endRest();
from("direct:services")
.errorHandler(noErrorHandler())
.multicast()
.setAggregationStrategy(new GroupedExchangeAggregationStrategy())
.executorServiceRef("executor")
.parallelAggregate()
.streaming()
.stopOnException()
.to("direct:route")
.end()
.end();
from("direct:route")
.errorHandler(noErrorHandler())
.bean("someRef", "someMethod")
.end();
我没有让异常处理程序使用交换并处理错误,而是立即返回了以下异常(到 SoapUI):
org.apache.camel.CamelExchangeException: Parallel processing failed for number 0. Exchange[...] at org.apache.camel.processor.MulticastProcessor.call(MulticastProcessor.java:328)
at org.apache.camel.processor.MulticastProcessor.call(MulticastProcessor.java:299)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
并且父路由以该异常结束并且没有异常处理。
如果 direct:anotherRoute
抛出异常,则该异常得到正确处理。
为什么我不能将多播异常传播到父路由?
骆驼 2.17-SNAPSHOT
开启多播的shareUnitOfWork
选项。查看更多详细信息:http://camel.apache.org/multicast and there is an example on the splitter which also has this option: http://camel.apache.org/splitter.html
尝试使用
.errorHandler(noErrorHandler())
在将异常传播到 onexception()