如何为Spring集成流程添加try catch异常以实现嵌套事务

时间:2019-06-11 11:03:28

标签: spring-integration spring-integration-dsl

如何在Spring集成流程中处理嵌套事务。基本上,我有一个从数据库中获取所有订单并按订单处理的过程,如果在单个订单上引发异常,则所有已处理的订单都将回滚。

    IntegrationFlows.from("perOrder")
         .filter(Order.class, order -> order.getItems().size() > 0)
         .handle(orderHandler, "handle") /*someway i way want to add try/catch for this method here so that 
if handle method throws exception, want to suppress for that order and mark as failure only for that order */
         .get();

public class OrderHandler {
   @Transactional(propagation = Propagation.NESTED)
   public handle() {
      processing code 
      throw exception in case of any validation failure
   }
}

1 个答案:

答案 0 :(得分:1)

为此,我们提供了一个 adviceChain 并将其注入到该handle()的端点中:

.handle((GenericHandler<?>) (p, h) -> {
                    throw new RuntimeException("intentional");
                }, e -> e.advice(retryAdvice()))

您可以在此处注入任何可用的Advice实现:https://docs.spring.io/spring-integration/docs/current/reference/html/#message-handler-advice-chain,包括TransactionInterceptorhttps://docs.spring.io/spring-integration/docs/current/reference/html/#tx-handle-message-advice

拥有 try ... catch 语义的最佳方法是使用ExpressionEvaluatingRequestHandlerAdvice。请参阅文档及其JavaDoc中的说明。