我使用Spring DSL定义了以下路由:
<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&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
的输出(出站消息),smoks处理器会抛出异常并挂起整个应用程序。当它这样做时,我可以看到在应用程序日志中抛出的异常(它实际上是一个MySQL异常),但不确定如何包装/捕获它并继续处理。我认为,给定上面的ErrorCatcher
设置,抛出的MySQL异常将被处理,路由将继续处理。相反,我从来没有在我的应用程序日志中看到证据,当这些Smooks/MySQL异常被抛出时,ErrorCatcher#handle
方法被执行。
我在这里配置了什么错误吗?还有什么我可以做的(无论是通过Smooks处理器的URI配置或其他东西),以防止异常被抛出从该处理器内部挂起整个应用程序?提前感谢!
这取决于Smooks团队如何实现他们的Camel组件。Camel错误处理程序只有在抛出了一个Camel可以捕获的异常时才会启动;或者在Exchange上使用setException显式设置了一个异常。如果smoks不这样做(也许他们捕获了异常,但没有将其传播回Camel),那么Camel就无法检测到该异常并对其做出反应。
如果您想要查看运行时发生了什么,您可以启用跟踪程序http://camel.apache.org/tracer
还请注意,当您使用bean处理带有错误处理程序的异常时。然后阅读如何访问导致的异常的FAQ: http://camel.apache.org/why-is-the-exception-null-when-i-use-onexception.html
你的配置似乎是正确的,如果你想看到它的工作,你可以改变你的句柄方法签名如下
public void handle(Exception exception, Exchange exchange) {
System.out.println("Got Exception..."+exception.getMessage());
System.out.println("Exchange is :"+exchange);
}
现在您可以在控制台上看到结果…