【问题标题】:Splitter aborts during exception with out processing subsequent messages异常期间拆分器中止,不处理后续消息
【发布时间】:2018-05-08 06:51:27
【问题描述】:

我需要拆分消息并一一处理。如果任何消息失败,我想将其报告给错误通道并继续处理下一个可用消息

我正在使用带有 1.0.0-SNAPSHOT 的 spring cloud aws 流启动器

我用 splitter 写了一个示例程序

     @Bean
      public MessageChannel channelSplitOne() {
        return new DirectChannel();
      }


      @StreamListener(INTERNAL_CHANNEL)
      public void channelOne(String message) {
        if (message.equals("l")) {
          throw new RuntimeException("Error due to l");
        }
        System.out.println("Internal: " + message);
      }


      @Splitter(inputChannel = Sink.INPUT, outputChannel = INTERNAL_CHANNEL)
      public List<Message> extractItems(Message<String> input) {
        return Arrays.stream(input.getPayload().split(""))
            .map(s -> MessageBuilder.withPayload(s).copyHeaders(input.getHeaders()).build())
            .collect(Collectors.toList());
      }

当我以 Hello 形式发送消息时,期望是 'h','e','o'会被处理,'l'会报错。

但是这里'l'之后的处理没有恢复。

有什么办法可以做到这一点。

【问题讨论】:

    标签: spring-integration spring-cloud-stream spring-integration-aws


    【解决方案1】:

    您可以这样做,但使用 @ServiceActivator 而不是 @StreamListener。第一个有adviceChain 选项,您可以在其中注入ExpressionEvaluatingRequestHandlerAdvicehttps://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/messaging-endpoints-chapter.html#expression-advice

    拆分器的问题就像 Java 中的常规循环,因此要在出错后继续,我们需要以某种方式添加 try...catch 那里。但这已经不是分裂者的责任。因此我们必须将这样的逻辑移到我们有错误问题的地方。

    【讨论】:

    • 谢谢。我不确定,如果我需要这里的建议链。我还删除了分离器。我正在拆分消息并手动发布到内部频道。我使用了try catch,如果有任何异常,我会手动创建errorMesage并发送到erroeChannel。
    • 好吧,那它不是 Spring Integration 解决方案。那是自制的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2011-09-16
    相关资源
    最近更新 更多