首页 > 解决方案 > 捕捉 Spring Integration DSL 错误配置异常?

问题描述

有没有办法捕捉DestinationResolutionExceptionMessageDispatchingException使用 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没有正确初始化。有没有办法捕捉这个异常?

标签: javaspringspring-integrationspring-integration-dsl

解决方案


这些异常是运行时错误。我们真的无法确定启动时的错误配置。

像这样捕获运行时异常并进行一些分析工作的方法是使用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


推荐阅读