Camel:向 DeadLetterChannel 发送交换时未设置 CamelFailureEndpoint
Camel: CamelFailureEndpoint not set when sending exchange to DeadLetterChannel
我正在开发一个涉及处理文件的 Camel(版本 2.15.3)的项目。
我有一些文件夹,其中消息以必须使用的文件形式出现,发送到执行某些操作的 bean,然后移动到正确的输出文件夹。
在我的 camel-context.xml
文件中,我假设 deadLetterErrorHandler
将是处理异常的策略:
<bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder" >
<property name="deadLetterUri" value="${deadLetterUri}"/>
</bean>
其中 deadLetterUri
也解析为文件夹。
我也是这样配置路由的:
<route id="lpcMillenniumRoute">
<from uri="lpcMillenniumInputFolder"/>
<to uri="log:testLog" />
<to uri="bean:fileManagerService?method=manageXmlFile(${body.absoluteFilePath})"></to>
<to uri="lpcMillenniumOutputFolder"/>
</route>
错误路由配置如下:
<route id="errorRoute">
<from ref="deadLetterUri" />
<log message="header.CamelFailureEndpoint = ${header.CamelFailureEndpoint}" loggingLevel="ERROR" />
<choice>
<when>
<simple>${header.CamelFailureEndpoint} == 'lpcMillenniumRoute'</simple>
<log message="Writing ${in.header[camelFileName]} to ${properties:lpcMillenniumErrorFolderUri}" loggingLevel="ERROR" />
<to uri="lpcMillenniumErrorFolder"/>
</when>
.....
问题是,一旦 bean 抛出异常,我会期望 header.CamelFailureEndpoint
变量被优雅地设置为端点失败的值,如 Camel dead letter channel documentation 中所报告的那样。
为了将消息正确发送到正确的错误文件夹,此类信息对我很有用。
不幸的是我设置的日志总是returns什么都没有。
我是不是漏掉了什么?
您提到您的 deadLetterErrorHandler
将消息保存在文件系统中。然后它被文件系统中的 errorRoute
拾取。这是一个不同的交换,因此导致错误的交换失败和异常 headers 不可用。
您可以尝试在同一个 camelcontext 中加入 lpcMillenniumRoute
和 errorRoute
(如果还没有的话),并设置 deadLetterUri
和 direct:dlc
以及<from uri="direct:dlc"/>
的错误路由。然后 errorRoute
处理导致错误的相同交换,骆驼失败和异常 headers 将可用。
我正在开发一个涉及处理文件的 Camel(版本 2.15.3)的项目。 我有一些文件夹,其中消息以必须使用的文件形式出现,发送到执行某些操作的 bean,然后移动到正确的输出文件夹。
在我的 camel-context.xml
文件中,我假设 deadLetterErrorHandler
将是处理异常的策略:
<bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder" >
<property name="deadLetterUri" value="${deadLetterUri}"/>
</bean>
其中 deadLetterUri
也解析为文件夹。
我也是这样配置路由的:
<route id="lpcMillenniumRoute">
<from uri="lpcMillenniumInputFolder"/>
<to uri="log:testLog" />
<to uri="bean:fileManagerService?method=manageXmlFile(${body.absoluteFilePath})"></to>
<to uri="lpcMillenniumOutputFolder"/>
</route>
错误路由配置如下:
<route id="errorRoute">
<from ref="deadLetterUri" />
<log message="header.CamelFailureEndpoint = ${header.CamelFailureEndpoint}" loggingLevel="ERROR" />
<choice>
<when>
<simple>${header.CamelFailureEndpoint} == 'lpcMillenniumRoute'</simple>
<log message="Writing ${in.header[camelFileName]} to ${properties:lpcMillenniumErrorFolderUri}" loggingLevel="ERROR" />
<to uri="lpcMillenniumErrorFolder"/>
</when>
.....
问题是,一旦 bean 抛出异常,我会期望 header.CamelFailureEndpoint
变量被优雅地设置为端点失败的值,如 Camel dead letter channel documentation 中所报告的那样。
为了将消息正确发送到正确的错误文件夹,此类信息对我很有用。
不幸的是我设置的日志总是returns什么都没有。
我是不是漏掉了什么?
您提到您的 deadLetterErrorHandler
将消息保存在文件系统中。然后它被文件系统中的 errorRoute
拾取。这是一个不同的交换,因此导致错误的交换失败和异常 headers 不可用。
您可以尝试在同一个 camelcontext 中加入 lpcMillenniumRoute
和 errorRoute
(如果还没有的话),并设置 deadLetterUri
和 direct:dlc
以及<from uri="direct:dlc"/>
的错误路由。然后 errorRoute
处理导致错误的相同交换,骆驼失败和异常 headers 将可用。