Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 配置Apache驼峰死信处理程序_Java_Apache Camel_Smooks_Dead Letter - Fatal编程技术网

Java 配置Apache驼峰死信处理程序

Java 配置Apache驼峰死信处理程序,java,apache-camel,smooks,dead-letter,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&am

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

您的配置似乎是正确的,如果您希望看到它正常工作,可以按如下所示更改handle-methods签名

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

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

这取决于Smooks团队如何实现其Camel组件。驼峰错误处理程序只有在抛出异常时才生效,驼峰可以捕获哪个异常;或者使用setException在Exchange上设置了显式异常。如果Smook不这样做(可能它们捕获异常,并且不将其传播回Camel),则Camel无法检测到该异常并对其作出反应

如果您想查看运行时的情况,可以启用跟踪程序


还请注意,当您使用bean使用错误处理程序处理异常时。然后阅读此常见问题解答如何访问导致的异常:

您使用的是哪种驼峰版本?我们曾经遇到过一个错误,错误处理程序的设置并没有像预期的那样有效。但是把它放在最上面会有用的。