Перехват исключений неверной конфигурации Spring Integration DSL? - PullRequest
1 голос
/ 21 марта 2019

Есть ли способ поймать DestinationResolutionException и MessageDispatchingException при использовании DSL? Эти исключения обычно указывают на неправильную настройку, но я не уверен, как я мог настроить свой поток, чтобы перехватить эти исключения и применить некоторую пользовательскую логику?

@SpringBootApplication
public class IntegrationMisconfigurationExampleApplication {
  public static void main(final String[] args) {
    SpringApplication.run(IntegrationMisconfigurationExampleApplication.class, args);
  }

  @Bean
  public IntegrationFlow loggingFlow() {
    return IntegrationFlows.from("input")
        .<String, String>transform(String::toUpperCase)
        // .nullChannel();
        .get();
  }

  @Bean
  public CommandLineRunner demo() {
    return args -> {
      final MessagingTemplate template = messagingTemplate();
      template.convertAndSend("input", "abc");
    };
  }

  @Bean
  public MessagingTemplate messagingTemplate() {
    return new MessagingTemplate();
  }
}

В приведенном выше примере выбрасывается DestinationResolutionException, поскольку loggingFlow.transformer#0 не инициализирован должным образом. Есть ли способ поймать это исключение?

1 Ответ

1 голос
/ 21 марта 2019

Исключениями являются ошибки времени выполнения . Мы действительно не можем определить неверную конфигурацию при запуске.

Способ отловить исключение во время выполнения и выполнить некоторую аналитическую работу с помощью ExpressionEvaluatingRequestHandlerAdvice, который вы можете добавить к вашей конфигурации transform(String::toUpperCase) во втором аргументе для конфигурации конечной точки:

.<String, String>transform(String::toUpperCase, e-> e.advice(myExpressionEvaluatingRequestHandlerAdvice()))

Подробнее об этом совете см. В Справочном руководстве: https://docs.spring.io/spring-integration/docs/current/reference/html/#message-handler-advice-chain

Также необходимо помнить, что transformer действительно является компонентом запроса-ответа с обязательным ненулевым возвращаемым значением. Поэтому вы действительно не можете настроить transform() только для одностороннего потока. Он будет выдавать исключение, когда в потоке нет следующего канала или в сообщении отсутствует заголовок replyChannel.

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