1

我使用 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 异常将被处理,并且路由将继续处理。相反,我从来没有在我的应用程序日志中看到ErrorCatcher#handle当这些 Smooks/MySQL 异常被抛出时该方法被执行的证据。

我在这里配置了什么不正确吗?我还能做些什么(通过 Smooks 处理器的 URI 配置或其他方式)来防止从该处理器内部引发的异常挂起整个应用程序?提前致谢!

4

2 回答 2

2

这取决于 Smooks 团队如何实现他们的 Camel 组件。Camel 错误处理程序仅在引发异常时才会启动,C​​amel 可以捕获该异常;或者使用 setException 在 Exchange 上显式设置了异常。如果 Smooks 不这样做(也许他们捕获了异常,并且不将其传播回 Camel),那么 Camel 就无法检测到该异常并对其做出反应。

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

另请注意,当您使用 bean 通过错误处理程序处理异常时。然后阅读此常见问题解答如何访问导致的异常:http ://camel.apache.org/why-is-the-exception-null-when-i-use-oneexception.html

于 2013-04-03T07:08:29.167 回答
0

您的配置似乎是正确的,如果您想查看它是否有效,您可以更改您的句柄方法签名,如下所示

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

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

于 2013-04-03T06:25:39.600 回答