【问题标题】:IMPORTANT onException shareUnitOfWork Apache Camel重要 onException shareUnitOfWork Apache Camel
【发布时间】:2020-06-19 11:01:35
【问题描述】:

当使用 onException 时,我不能让它共享工作单元。我确实需要使用多播和拆分器。 到目前为止,我已经尝试过 useOriginalMessage 等,但无法成功。

   onException(Exception.class)
            .handled(Boolean.TRUE)
            .process(XXX)
            .marshal()
            .jacksonxml()
            .convertBodyTo(String.class)
            .removeHeader(XXXX)
            .end();



   from(RouteDefinition.XXX)
            .id("XXX")
            .unmarshal().jacksonxml(XXX.class)
            .to("bean-validator://x")
            .setHeader(XXXS, constant(XXX.class))
            .setProperty(ApplicationParam.REQUEST_BODY, body())
            .bean(xxxx, "XXX")
            .setHeader(Exchange.HTTP_METHOD, constant(HttpMethod.POST))
            .setHeader(Exchange.CONTENT_TYPE, constant(MediaType.APPLICATION_JSON))
            .setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, constant(XXX.class))
            .to(restUri(jaxrsEndpoint, uri))
            .removeHeader(Header.HEADER_LIST)
            .bean(xxxx, "responseBeanXX")
            .marshal().jacksonxml(); 

流程; Apache CXF -> JAXRS-> 异常 -> OnException -> 处理器 -> 响应正文

【问题讨论】:

  • @Kavithakaran Kanapathippillai 我添加了一些信息。感谢您提供信息。
  • 好吧,我想在这一点上异常并不重要。当 Camel 时,全局中的 onException 创建新线程,我无法共享工作单元。此外,我正在使用带有 MDC 日志记录的 log4j2。因此,在此示例中,我想使用 MDC 日志记录将所有内容记录在异常中。
  • 对不起,我不明白你的问题。我在您的代码中没有看到 UnitOfWork 的任何用法。
  • 那么,我如何在 onException 定义上共享 MDCUnitOfWork? @burki
  • 也许@Claus Ibsen 帮帮我:)

标签: spring-boot apache-camel apache-camel-3


【解决方案1】:

如果你只想使用MDC logging in Camel,你可以用camelContext.setUseMDCLogging(true);激活它

我不知道 Camel 3.x 是否仍然支持这一点,因为官方 Camel 文档中不再存在链接的文档页面。

如果您想在骆驼路线中使用 UnitOfWork,请查看 this page

【讨论】:

  • 当然是这样配置的,camelContext.setUseMDCLogging(true); ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class); ecc.setUnitOfWorkFactory(new MyCustomUnitOfWork());
  • 您是否收到类似MDC logging is enabled on CamelContext: [context name] 的日志消息?如果启用它应该是这种情况。否则尝试调试应用程序启动并检查是否调用了您的上下文配置。
  • 很快,我做了我配置的。顺便说一句,MDC 日志记录工作正常。我在这个话题上没有问题。但是,Camel 不会调用工作类的 onException 路由定义单元。例如,工作类的onComplete路由定义单元就是由它调用的。我对这种情况的看法是,不在 onException 路由定义上调用工作单元类
  • 如果您想对与 unitOfWork 的失败交换做出反应,请使用 onCompletion().onFailureOnly()...
  • 是的,我是这样做的 :) 但是,我的流程与此不兼容 :D
【解决方案2】:
   DefaultErrorHandlerBuilder defaultErrorHandlerBuilder = new DefaultErrorHandlerBuilder();
    defaultErrorHandlerBuilder.setOnExceptionOccurred(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            CustomUnitOfFactory customUnitOfFactory = new CustomUnitOfFactory ();
            customUnitOfFactory .afterPropertiesConfigured(camelContext);
            customUnitOfFactory .createUnitOfWork(exchange);
        }
    });
    errorHandler(defaultErrorHandlerBuilder);

@burki 我用上面的代码解决了这个问题。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多