как добавить исключение try catch для весеннего интеграционного потока для выполнения вложенных транзакций - PullRequest
1 голос
/ 11 июня 2019

Как обрабатывать вложенные транзакции в весеннем потоке интеграции.По сути, у меня есть процесс, который выбирает все заказы из базы данных и обрабатывает их заказ за заказом, в случае возникновения исключения для одного заказа все обработанные заказы возвращаются назад.

    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 Ответ

1 голос
/ 11 июня 2019

Для этой цели мы предоставляем 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,, включая TransactionInterceptor: https://docs.spring.io/spring-integration/docs/current/reference/html/#tx-handle-message-advice

Лучший способ получить семантику try ... catch - использовать ExpressionEvaluatingRequestHandlerAdvice. См. Его описание в Документах, а также его JavaDocs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...