使用拦截器时的骆驼异常处理行为

Mic*_*ent 2 java apache-camel

在单元测试中,我想模拟Exception发生的情况。

由于doTry/doCatch-block ,我希望在“mock:count”端点收到一条消息。为什么这没有发生,为什么Exception由一般onException-block处理?

import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.cxf.binding.soap.SoapFault;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

public class TestClass extends CamelTestSupport {
   @Override
   protected RouteBuilder createRouteBuilder() throws Exception {
      return new RouteBuilder() {
         @Override
         public void configure() throws Exception {
            onException(Exception.class)
                  .log(LoggingLevel.INFO, "outer catch")
                  .handled(true);

            from("direct:start")
                  .doTry()
                     .to("mock:exception")

                  .doCatch(Exception.class)
                     .log(LoggingLevel.INFO, "inner catch")
                     .to("mock:count")
                  .end();
         }
      };
   }

   @Test
   public void testBlaat() throws Exception {
      final SoapFault soapFault = new SoapFault("Something clearly went wrong", SoapFault.FAULT_CODE_CLIENT);
      Element detail = soapFault.getOrCreateDetail();
      Document doc = detail.getOwnerDocument();
      Text tn = doc.createTextNode("Fault details");
      detail.appendChild(tn);

      context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
         @Override
         public void configure() throws Exception {
            interceptSendToEndpoint("mock:exception").throwException(new Exception("test"));
         }
      });

      template.sendBody("direct:start", "start");

      MockEndpoint endpoint = getMockEndpoint("mock:count");
      endpoint.expectedMessageCount(1);

      assertMockEndpointsSatisfied();

   }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ent 5

事实证明,当路由被 截获时AdviceWithRouteBuilder,从RouteDefinition's不会看到从 an 抛出的异常,因为它们在不同的通道上。解决这个问题的方法是对端点使用模拟并从模拟中抛出异常:doTry/doCatchAdviceWithRouteBuilder

getMockEndpoint("mock:exception").whenAnyExchangeReceived(new 
Processor() { 

            @Override 
            public void process(Exchange exchange) throws Exception { 
                throw new Exception("fail me"); 
            } 
        });
Run Code Online (Sandbox Code Playgroud)

见:http : //camel.465427.n5.nabble.com/question-about-exception-handling-behavior-td5743489.html

另请参阅 JIRA 上的此问题:https : //issues.apache.org/jira/browse/CAMEL-6300 它已在 Camel 2.10.5 和其他较新版本中修复。