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

Apache Camel-使用多路由生成器进行异常处理

郭和硕
2023-03-14
public class RestRouter extends RouteBuilder
{
    @Override
    public void configure() throws Exception
    {
        rest("/sample")
                .post()
                .route()
                .routeId("postSample")
                .to("direct:validate")
                .to("direct:save")
                .endRest();
    }
}
public class CustomRouter extends RouteBuilder
{

    @Override
    public void configure() throws Exception
    {
        onException(ValidationException.class)
                .handled(true)
                .setBody(simple("${exchangeProperty[CamelExceptionCaught]}"))
                .to("bean:exceptionHandler?method=constraintViolationHandler")
                .setHeader(Exchange.CONTENT_TYPE, constant(ErrorResponse.class.getName()))
                .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(HttpStatus.SC_BAD_REQUEST));

        validator()
                .type(Sample.class)
                .withBean("sampleValidator");

        from("direct:validate")
                .to("bean-validator://x"); // Runs javax/Hibernate annotated validations

        from("direct:save")
                .routeId("saveSample")
                .inputTypeWithValidate(Sample.class)
                .to("bean:sampleRepository?method=save");
    }
}

安装程序的问题是,Camel没有为validationexception调用我的自定义异常处理程序。路由SaveSample发生验证异常。下面是我的发现,它是如何进一步深入骆驼处理器类型的。

>

  • 控件将转到RedeliveryErrorHandler的handleException()中,在那里查找异常策略。失败exchange的根(即RestRouter->postSample)在此应定义异常处理程序。
  • 稍后,Camel转到failingunitofwork(即saveSample)以标识异常处理程序。
  • 这意味着,在下面的表达式中,routeId来自CustomRouter,而exceptionPolicy来自RestRouter。组合不存在,Camel无法找到异常处理器。

    处理器=ExceptionPolicy.getErrorHandler(routeId)

    在上述背景下,我有以下几个问题

    1. 在多个RouterBuilder类型中划分一个功能是一个好的做法吗?
    2. 骆驼不应该使用当前的UnitOfWork来解决异常策略吗?
    3. 如果提供不同的RouteBuilder类型,Camel是否可以调用我的自定义处理程序?

    编辑我不能移动到只有一个RouterBuilder

    • 一个,因为我有一个Apache Avro对象从另一个orchestration服务中加入post的有效载荷,然后通过bean方法,而不是使用Camel的transformer来完成到JPA实体的转换。这种安排不适合Camel调用验证器的方式(请参见contractadvice)。ContractAdvice是一个CamelInternalProcessorAdvice,它应用Transformer(如果intype!=outtype)和Validator
    • 其次,转移到单个RouterBuilder将需要我将Avro-to-Entity逻辑转移到骆驼Transformer中,而这种方法将与我们当前所做的方式有很大不同。但是,可以使用单个RouterBuilder+Transformer+Validator。
  • 共有1个答案

    孔逸春
    2023-03-14

    让我们看看这个来自Camel In Action的示例,它演示了如何在Java DSL中定义的路由构建器之间重用错误处理。

    BaseRouteBuilder和InboxRouteBuilder和OrderRouteBuilder

    您可以创建一个基类来设置上下文范围的错误配置,然后您的RouteBuilder类扩展这个基类并调用calling Super.Configure以获得公共配置。

     类似资料:
    • 我的申请中有如下路线- 从("sftp: config").到("file: config") 我必须在生成endpoint时处理那些超出apache camel默认异常处理边界的异常。例如。编写文件时可能会出现异常。我如何处理那个异常? 在camel文档中,我了解到,对于文件消费者,他们提供了不同的选项,比如-consumer。errorHandler和consumer。bridgeErrorH

    • 问题内容: 这是处理生成器中引发的异常的后续操作,并讨论了一个更一般的问题。 我有一个功能,可以读取不同格式的数据。所有格式都是面向行或记录的,每种格式都有一个专用的解析功能,可以作为生成器来实现。因此,主读取函数获得一个输入和一个生成器,该生成器从输入中读取其各自的格式并将记录传递回主函数: 哪里是这样的: 我面临的问题是,尽管可能引发异常(例如,从流中读取时),但它不知道如何处理它。负责处理异

    • 问题内容: 尝试添加pdf文件生成时,我看到奇怪的行为。 在if语句上,以下代码将引发:both \ routes.js 错误:只能在方法调用中调用Meteor.userId。在发布函数中使用this.userId。在[对象Object] .Router处的Object.Meteor.user(packages / accounts-base / accounts_server.js:24:1)处

    • 但没能完成。如果有某种方法可以在camel路由构建器级别获得netty服务器异常?请建议 谢谢

    • 问题内容: 假设我有一个抛出某种Exception的方法。引发异常的代码位于访问外部服务的第三方库中。我有一些课程可以很好地处理外部服务,并且有很多异常处理程序可以处理潜在的问题。我遇到的问题是我可能有很多异常,但是如果有一个动作,并且可能有大量尝试/捕获块,我可能只需要执行几个动作之一。异常的类型甚至可能不相关,或者不同的方法可能会抛出相同类型的异常,但是根据抛出该异常的方法,需要采取不同的操作

    • 我正在尝试使用angular与主播合作,我已经做了我的研究,但没有成功,所以我正在联系你们。 我有 3 个组件 {导航栏组件, 红色组件, 蓝色组件} 导航栏组件有 2 个锚点。我希望当我单击其中一个时,它实际上会将我引导到正确的组件 导航栏组件.ts 红色. component.ts blue.component.ts app.component.html 应用程序模块