Spring boot 重要的一个例外是shareUnitOfWork Apache Camel
使用OneException时,我无法让它共享工作单元。我确实需要使用多播和拆分器。 到目前为止,我已经尝试过使用原始信息等,但都做不到Spring boot 重要的一个例外是shareUnitOfWork Apache Camel,spring-boot,apache-camel,apache-camel-3,Spring Boot,Apache Camel,Apache Camel 3,使用OneException时,我无法让它共享工作单元。我确实需要使用多播和拆分器。 到目前为止,我已经尝试过使用原始信息等,但都做不到 onException(Exception.class) .handled(Boolean.TRUE) .process(XXX) .marshal() .jacksonxml() .convertBodyTo(String.class
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->Exception->OneException->Processor->Response Body如果您只想使用,可以使用camelContext.setUseMDBlockingTrue激活它
我不知道Camel 3.x是否仍然支持此功能,因为官方Camel文档中不再存在链接文档页面
如果您想在驼峰路线中使用UnitOfWork,请签出
@burki我用上面的代码解决了这个问题。@Kavithakaran kanapathipillai我添加了一些信息。谢谢你提供的信息。我想在这一点上,例外并不重要。当全局中的MonException创建新线程时,我不能共享工作单元。此外,我将log4j2与MDC日志一起使用。因此,在本例中,我想用MDC日志记录所有异常。对不起,我不理解您的问题。我在您的代码中没有看到UnitOfWork的任何用法。那么,我如何在OneException定义上共享MDCUnitOfWork呢@burkiMaybe@Claus Ibsen help me:当然,它是以这种方式配置的,camelContext.setUseMDBlockingTrue;ExtendedCamelContext ecc=camelContext.AdaptedExtendedCamelContext.class;ecc.setUnitOfWorkFactorynew MyCustomUnitOfWork;您是否收到一条日志消息,比如在CamelContext:[上下文名称]上启用了MDC日志记录?如果启用,则应为这种情况。否则,尝试调试应用程序启动并检查是否调用了上下文配置。MDC日志工作正常。顺便说一句,我在这个主题上没有问题。但是,工作类的OneException路由定义单元不是由Camel调用的。例如,它调用工作类的onComplete路由定义单元。我对这种情况的看法是,如果您想对unitOfWork的失败交换做出反应,那么就使用onCompletion。onFailureOnly…是的,我是这样做的:但是,我的流程的流程与此不兼容:D
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);