当前位置: 首页 > 知识库问答 >
问题:

让Apache Camel在OneException路由上有条件地注入头

谢承
2023-03-14

Java8/Camel 2.19. x在这里。我有以下路由XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:spring="http://camel.apache.org/schema/spring"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.0.0.xsd"
>
    <routeContext id="myRoute" xmlns="http://camel.apache.org/schema/spring">

        <route id="doStuff">
            <from uri="activemq:input"/>

            <onException useOriginalMessage="true">
                <exception>java.lang.Exception</exception>
                <redeliveryPolicy logStackTrace="true"/>
                <handled>
                    <constant>true</constant>
                </handled>

                <log message="${exception.stacktrace}" loggingLevel="ERROR"/>

                <!-- we get the original XML message - convert it to an object -->
                <unmarshal ref="xstream"/>

                <wireTap uri="bean:errorProcessor" copy="true"/>

                <rollback markRollbackOnly="true"/>
            </onException>

            <transacted ref="shared"/>
            <doTry>
                <unmarshal ref="xstream"/>
                <to uri="bean:thingProcessor"/>
        <marshal ref="xstream"/>
                <to uri="activemq:output"/>
            </doTry>
        </route>
    </routeContext>
</beans>

所以,很简单:

  1. 在愉快路径上,从AMQ上的输入队列中消费,将其反序列化(通过XStream)为Java对象,将其发送到thingProcessor,并将该处理器的结果放在输出队列中
  2. 如果发生异常,例如thingProcessor抛出RuntimeException,我们将异常堆栈跟踪记录到应用程序日志中,然后转换原始XML(我们从输入队列中消耗的XML),将其反序列化为POJO,并将其发送给errorProcessor进行处理。最后,我们回滚JMS事务

出现故障时,消息上有时会出现CamelFilePath头,我希望错误处理器(errorProcessor)接受这一点,并在有头的情况下执行特殊逻辑。

目前我的错误处理器如下所示:

@Component("errorProcessor")
public class ErrorProcessor {

    private static final Logger log = LoggerFactory.getLogger(ErrorProcessor.class);

    private final ErrorHelper errorHelper;

    public ErrorProcessor(final ErrorHelper errorHelper) {
        this.errorHelper = errorHelper;
    }

    public void handleErrors(
            final Fizzbuzz fizzbuzz,
            @Header("CamelFilePath") final String camelFilePath,
            @ExchangeProperty(Exchange.EXCEPTION_CAUGHT) final Exception exception) {

        // If camelFilePath is non-null and non-empty, do stuff with it here.

    }
}

上面,fizzbuzz是原始的(反序列化的)XML/POJO,它是从输入队列中消耗的。

有时消息/交换上会出现CamelFilePath头,有时则不会。我如何调整我的路线,以便如果它存在于“快乐路径”路线上,它将被复制并出现在“错误”路线上(即,从<代码>

提前感谢!

共有1个答案

令狐运珧
2023-03-14

您可以在路线中使用choice和simple子句
我只知道java dsl,但转换为xml很简单

.choice().when().simple("${header.CamelFilePath} != null && ${header.CamelFilePath} not contains ''").wireTap("bean:errorProcessor");


在xml上是这样的:

<choice>
 <when>
  <simple>
    ${header.CamelFilePath} != null &amp;&amp; ${header.CamelFilePath} not contains ''
  </simple>
  <wireTap uri="bean:errorProcessor" copy="true"/>
 </when>
 类似资料:
  • 问题内容: 我想基于从客户端传递的String参数注入一个bean。 我希望基于传递的参数注入报表实例。任何帮助将不胜感激。提前致谢 问题答案: 使用工厂方法模式: 当您使用以下命令调用控制器时,Spring可以创建报告类型: 但是,它非常笨拙,并且每次添加新报告类型时都需要进行修改。如果报告类型列表已修复,则可以。但是,如果您计划添加越来越多的类型,这将是一个更可靠的实现: 通过此实现,添加新的

  • 问题内容: 我正在使用React Router 1.0.2,我的路线如下所示: 我的App组件如下所示,我认为我可以在道具中传递位置: 我想在Menu组件上有条件地设置一个活动类: 但是,当调用菜单的render函数时,null是否为null? 如何将道具传递给子组件? 问题答案: 好像您没有将prop传递到正确的元素中。该的将是什么子路径被渲染(所以无论是或),但你想要的道具要传递给。 为此,只

  • 我一直在尝试模块化我的React.js应用程序(它将作为带有Electron的桌面应用程序提供),如果我将来制作一个新模块,我只需添加一个新文件夹和修改几个文件,它就可以很好地集成。我最初受到这篇文章的启发:https://www.nylas.com/blog/react-plugins/ 在那之后,我开始尽可能多地研究,并最终创建了一个JSON文件,该文件将保存在服务器中,其中包含为特定客户机注

  • 问题内容: 我有一项服务有两项操作。 我有骆驼大溃败: 在我的处理器bean中,当我指定时: 我得到了注册用户对象。一切正常。问题是我希望骆驼有条件地路由我的请求,例如: 如果服务操作是我要将消息路由到我的特定bean,并且如果服务操作是我要将消息路由到另一个bean。 我尝试使用骆驼xPath,但似乎无法正常工作。 我正在搜索如何设置骆驼以路由到不同的目标,但没有找到任何东西。也许有人知道问题可

  • 我希望有一个响应的应用程序。它应该有一个不同的导航在一个小屏幕上(一系列屏幕下钻至详细页面)和一个大屏幕上(左面板详细信息在一个页面上)。 由于Angular2中的路由是在组件级别上定义的,因此我的想法是创建一个根级组件,该组件将有条件地(ngIf)包括bigScreen.component.ts或smallScreen.component.ts。然后,路由本身将在 bigScreen/small

  • 是否可以在库伯内特斯中配置入口控制器,仅当传入请求的标头具有特定值时才将HTTP请求路由到服务? 实例 带有以下标头的HTTP请求 应该转发给服务1 带有以下标头的HTTP请求 应该被阻止 如果可能的话,你能详细一点或指向一些文档,因为我找不到这种用例的文档吗