2013-04-02 40 views
1

使用Spring DSL我有以下路線定義:配置Apache駱駝死信處理程序

<camelContext id="myapp-camel-ctx" errorHandlerRef="deadLetterErrorHandler" 
xmlns="http://camel.apache.org/schema/spring"> 
    <route id="myapp-camel-route"> 
     <from uri="timer://runOnce?repeatCount=1&amp;delay=10" /> 

     <to uri="bean:fizzBean?method=doFizz" /> 

     <!-- What I call the "Smooks processor" --> 
     <to uri="smooks://my-smooks-config.xml" /> 

     <to uri="bean:buzzBean?method=doBuzz" /> 
    </route> 
</camelContext> 

<bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder"> 
    <property name="deadLetterUri" value="bean:errorCatcher" /> 
</bean> 

<bean id="errorCatcher" class="com.me.myorg.myapp.ErrorCatcher"> 
    <property name="foo" value="BAR" /> 
</bean> 

有時,根據所述輸出的fizzBean的(出站消息),所述的Smooks處理器拋出異常和掛整個應用。當它這樣做時,我可以看到應用程序日誌中拋出的異常(它實際上是一個MySQL異常),但不知道如何包裝/捕獲它並繼續處理。我想認爲,假設上面的設置ErrorCatcher,拋出的MySQL異常將被處理,並且該路由將繼續處理。相反,我從來沒有在應用程序日誌中看到在引發這些Smooks/MySQL異常時執行ErrorCatcher#handle方法的證據。

我在這裏配置了不正確的東西嗎?還有什麼我可以做的(通過Smooks處理器的URI配置或其他),以防止從該處理器中拋出的異常掛起整個應用程序?提前致謝!

+0

您使用的是哪種駱駝版本?在上設置錯誤處理程序沒有按預期工作時,我們有一次錯誤。但是在上設置它會起作用。 –

回答

2

這取決於Smooks團隊如何實施他們的Camel組件。如果發生異常,Camel可以捕獲Camel錯誤處理程序;或者使用setException在Exchange上顯式設置了一個異常。如果Smooks不這樣做(也許他們捕獲了異常,並且不會將它傳播給Camel),那麼Camel無法檢測到該異常並對其作出反應。

如果你想看到在運行時發生的事情,你可以啓用示蹤 http://camel.apache.org/tracer

而且記住,當你使用一個bean來處理與錯誤處理程序除外。然後閱讀本FAQ,瞭解如何訪問引起的異常:http://camel.apache.org/why-is-the-exception-null-when-i-use-onexception.html

0

你的配置似乎是正確的,如果你想看到它的工作原理,你可以改變你處理方法的簽名如下

public void handle(Exception exception, Exchange exchange) { 
    System.out.println("Got Exception..."+exception.getMessage()); 
    System.out.println("Exchange is :"+exchange); 
    } 

現在你可以在控制檯上看到結果...