2017-05-03 102 views
1

我正在使用Java DSL來配置路由。我有一條類似於下面給出的路線。Apache駱駝 - 處理和重新拋出異常

RouteBuilder builder = new RouteBuilder() { 
     public void configure() { 
      // onException(Exception.class).bean("bean"); 

      onException(Exception.class).to("anotherProcessor"); 

      from("queue:a").bean("someBean").to("processor"); 
     } 
    }; 

如何在做某些活動後炸燬異常?在例外情況下,我嘗試配置一個處理器和一個bean來重新拋出異常。無論哪種方式,駱駝設置例外交換,但不能炸掉異常。

我正在做一個junit測試用例。我正在使用onException處理器處理異常。在處理器內部,我正在做我的斷言。斷言錯誤由駱駝自動處理,並且測試不會被標記爲合格/不合格。

+0

你是什麼意思「炸掉例外」?你想達到什麼樣的行爲? – Ralf

+0

我有一個處理器onException,如果它拋出任何錯誤或異常,控制去DelegateSyncProcessor和異常/錯誤沒有冒泡到客戶端。 –

+0

您是否使用Camel JMS組件?如果是,那麼你需要設置'transferException = true'(參見[documentation](http://people.apache.org/~dkulp/camel/jms.html))。您也可能需要在'onException'語句中調用'.handled(false)'。如果錯誤是由處理器處理的,我不記得駱駝的默認設置是什麼。可能是因爲Camel將默認情況下處理的異常標記爲異常。 – Ralf

回答

0
from(CONSUMER) 
    .doTry() 
    .doCatch(SocketTimeoutException.class,Exception.class) 
      .beanRef("ErrorProcessor","processErrorMessage") 
      .to("freemarker:ErrorResponseTransformer.ftl") 
    .end() 
    .to(PRODUCER) 

的try-catch

上異常 處理異常並處理它作爲響應錯誤消息以顯示
onException(Exception.class) 
     .handled(true) 
     .process(new Processor() { 
      public void process(Exchange e) throws Exception { 
       helper.processErrorMessage(e); 
       log.info("Response error: " 
         + MessageHelper.extractBodyAsString(e.getIn())); 
       log.info("Response error: " 
         + MessageHelper.extractBodyAsString(e.getOut())); 
      } 
     }); 

。你甚至可以把.to(ERRORDESTINATION)或竊聽繼續正常流量。

或使用駱駝的errorHandler

希望這會有所幫助。

+0

我有一個處理器onException,如果它引發任何錯誤或異常,控制去DelegateSyncProcessor和異常/錯誤不冒泡到客戶端。 –

+0

錯誤處理最佳實踐 - >在您的接口正在擴展的框架或超類中,默認情況下應該有一個DeadLetterChannel或ErrorHandler,以便能夠捕獲任何未處理的異常。 –

+0

我已更新我的問題。 –