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 中加入 lpcMillenniumRouteerrorRoute(如果还没有的话),并设置 deadLetterUridirect:dlc 以及<from uri="direct:dlc"/> 的错误路由。然后 errorRoute 处理导致错误的相同交换,骆驼失败和异常 headers 将可用。