Spring Cloud Stream Reactive-在反应流管道的情况下如何进行错误处理?

时间:2018-11-22 21:34:28

标签: spring-cloud-stream spring-kafka

如何对反应流管道进行错误处理。喜欢

  • 应用程序错误处理(例如:errorChannel)
  • 系统错误处理(使用DLQ,重新处理等)

当前文档仅描述了非反应性管道的错误处理。 https://docs.spring.io/spring-cloud-stream/docs/Fishtown.BUILD-SNAPSHOT/reference/htmlsingle/#_application_error_handling

  

通过为错误处理方案提供简单的配置,Spring云流对用户来说非常容易。如果相同的错误处理用例(具有相同的配置)也适用于反应流管道,那就太好了。用例和相应的配置详细信息如下:

  • @StreamListner(“ errorChannel”)批注用于全局错误处理
  • @KafkaListener(id =“ bar”,topic =“ reactive-stream-error-topic”)
  • 配置DLQ并生成针对错误主题的失败消息 spring.cloud.stream.kafka.bindings.input.consumer.enableDlq = true spring.cloud.stream.kafka.bindings.input.consumer.dlqName = reactive-stream-error-topic

文档中的示例在spring-cloud-stream 上运行良好,但是同一件事也会导致响应式管道出错。朝这个方向的任何指导方针都将对社区有很大帮助。预先感谢!

@SpringBootApplication
@EnableBinding(Sink.class)
public class ReactiveStreamSinkApplication {

public static void main(String[] args) {
    SpringApplication.run(ReactiveStreamSinkApplication.class, args);
}

@StreamListener
public void receive(@Input(Sink.INPUT) Flux<String> inputFlux) {
    inputFlux.subscribe(System.out::println);
    throw new RuntimeException("BOOM!");
}

@StreamListener("errorChannel")
public void error(Message<?> message) {
    // log the error msg
    System.out.println("Handling ERROR: " + message);
}

@KafkaListener(id="bar", topics = "reactive-stream-error-topic")
public void error(String in) {
    System.out.println(in + " from DLQ");
}
}

1 个答案:

答案 0 :(得分:0)

对不起,您的回复很晚。

首先,您的代码有问题,并且您正在处理如何从响应流中引发异常的方法。基本上,您正在处理一个声明性处理程序,该处理程序有很大不同。在您的代码中,receive方法在启动和初始化期间仅被调用一次。因此,从中引发异常根本不等于在流处理期间引发的异常,这是您要查询的错误处理机制的设计目的。但。 。

那边。 。

由于Spring Cloud Function编程模型的引入,我们正在考虑将注意力从反应性模块转移到一起,因为Spring Cloud Function已经提供了对反应性编程模型的支持。 因此,请考虑以下几点:

@SpringBootApplication
@EnableBinding(Sink.class)
public class ReactiveStreamSinkApplication {

    public static void main(String[] args) {
        SpringApplication.run(ReactiveStreamSinkApplication.class,
        "--spring.cloud.stream.function.definition=myconsumer");
    }

    @Bean
    public Consumer<Flux<String>> myconsumer() {
        return stream -> stream.subscribe(value -> {
            if ("foo".equals(value)) {
                throw new RuntimeException("BOOM!");
            }
            System.out.println("Received value: " + value);
        });
    }

    @StreamListener("errorChannel")
    public void error(Message<?> message) {
        // log the error msg
        System.out.println("Handling ERROR: " + message);
    }
}

尝试一下,让我们知道。