配置Apache Camel死信处理程序

时间:2013-04-02 20:54:09

标签: java apache-camel smooks dead-letter

我使用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&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配置或其他东西),以防止从处理器内部抛出异常挂起整个应用程序?提前谢谢!

2 个答案:

答案 0 :(得分:2)

这取决于Smooks团队如何实施他们的Camel组件。如果抛出异常,Camel可以捕获Camel错误处理程序;或者使用setException在Exchange上有一个异常显式设置。如果Smooks没有这样做(可能他们捕获异常,并且不会将其传播回Camel),那么Camel无法检测到该异常并对其做出反应。

如果要查看运行时发生的情况,可以启用跟踪器 http://camel.apache.org/tracer

还要注意,当您使用bean来处理异常并使用错误处理程序时。然后阅读此常见问题解答如何访问引起的异常:http://camel.apache.org/why-is-the-exception-null-when-i-use-onexception.html

答案 1 :(得分:0)

您的配置似乎是正确的,如果您想看到它的工作原理,您可以更改您的句柄方法签名,如下所示

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

现在你可以在控制台上看到结果......