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

Apache Camel:OnCompletion和OneException查询

蒋星雨
2023-03-14

在我的项目中,我想在每个新创建的路由上应用单独的OnComplection和OnException处理器。

假设我必须创建3条路线。对于每个路由,我准备了一个单独的RouteBuilder类,并进行如下配置-

onException(Throwable.class).handled(true).process(new ExceptionHandlingProcessor(RouteId)).maximumRedeliveries(2)
        .redeliveryDelay(1000).retriesExhaustedLogLevel(LoggingLevel.ERROR)
        .retryAttemptedLogLevel(LoggingLevel.WARN);

 onCompletion().process(new OnCompletionProcessor(RouteId)) ;

        from("sftp:Configuration").routeId("test")
        .choice()
            .when(body().isEqualTo(null))
                .process(new AgeCalculatingProcessor("test"))
            .otherwise()
                .to("file:configuration").log("Downloaded file ${file:name} complete.")
                ;

我的问题是……OneException和OnCompletion是在同一个route Builder类上创建的路由上工作(因为我在每个RouteBuilder类中只创建一个路由),还是将应用于上下文级别并在所有路由上工作?

实际上,我想在路由级别应用OneException和OnCompletion,但如果我在每个endpoint上应用OneException,我会遇到异常(比如-尝试将OneException移动到路由的顶部),如下图所示-

来自(sftp:conf).OnException(Throwable.class)。restExceptionconf.to(文件:conf.OnException(Throwable.class).restExceptionconf

共有1个答案

鲍建业
2023-03-14

RouteBuilder级别onException:如果您像这样定义onException处理程序

onException(...).log("This is RouteBuilder level exception handling.");

configure() {
    from(...).to(...);
}

它将处理同一RouteBuilder中所有路由的异常。

路由级别onException:如果您像这样定义onException处理程序

configure() {
    from(...)
    .onException(...).log("This is Route level exception handling.");
    .to(...);
}

它将成为路由级OneException处理程序,并且仅用于该单一路由上的异常。

路由级OneException定义将覆盖RouteBuilder级定义(例如,如果两者都定义了OneException(MyException.class),那么如果在该路由上引发了MyException,则只有在路由中直接定义的一个才会被调用)。

onComplection的行为方式与onException相同。

关于“尝试将OneException移动到路由顶部”的异常:您应该只在路由的开头定义OneException,如下所示:

from(sftp:conf).OnException(Throwable.class).restExceptionconf
   .to(file:conf);

进一步阅读此处的OneException和此处的onCompletion。

 类似资料:
  • Java8/Camel 2.19. x在这里。我有以下路由XML: 所以,很简单: 在愉快路径上,从AMQ上的输入队列中消费,将其反序列化(通过XStream)为Java对象,将其发送到thingProcessor,并将该处理器的结果放在输出队列中 如果发生异常,例如thingProcessor抛出RuntimeException,我们将异常堆栈跟踪记录到应用程序日志中,然后转换原始XML(我们从

  • 有以下骆驼路线。 重新交付策略在xml中定义如下- 但是,当抛出异常时,会在执行OnException块之前进行重新传递尝试(一些配置属性会在onException块中更新。在OnException内部的DiscoveryService中有一个调试点,它会在进行重新传递尝试后被调用)。因此,当前消息在没有重新传递的情况下丢失。不确定为什么会发生这种情况。使用actiemq-camel版本5.8.0

  • 问题内容: Redis在概念上与我使用的传统SQL数据库有所不同,我正在尝试确定它是否适合我的项目…我一直在寻找,但似乎找不到我的问题的答案。 我有一组用户需要存储,每个用户都有一个唯一的ID和与之关联的几个值(例如其名称)。看来我可以简单地将它们存储为哈希: 我还有一堆要存储的消息,每个消息都有一些属性,例如发送者和接收者: 我的问题是,我将如何检索特定用户发送的所有消息(由其哈希指定)。我应该

  • 这个问题给出了正确的节点,但是所有的节点都同时给出了。 还有当时,它什么也不返回?

  • DetachedCriteria 类使你在一个 session 范围之外创建一个查询,并且可以使用任意的 Session 来执行它。 DetachedCriteria query = DetachedCriteria.forClass(Cat.class) .add( Property.forName("sex").eq('F') ); Session session = ...

  • AddressTemporal类 我已经将lucene配置为使用字符串常量(“null”)索引空字段,这样我就可以使用该值查询空字段。 我的问题是,我需要执行一个查询,该查询将在集合中搜索,但只筛选那些where字段为空的查询。现在 谢谢 乌利塞斯