重试关键业务逻辑

在某些情况下,你可能需要重新尝试对应用至关重要的业务逻辑部分。 可能会调用关系数据库,或者调用 Kafka Streams 处理器中的 REST 端点。 这些通话可能因网络问题或远程服务无法使用等多种原因而失败。 更常见的是,如果你能再试一次,这些失败可能会自行解决。 默认情况下,Kafka Streams 绑定器会创建重试模板所有输入绑定都用豆子。spring-doc.cadn.net.cn

如果函数的签名如下,spring-doc.cadn.net.cn

@Bean
public java.util.function.Consumer<KStream<Object, String>> process()

以及默认绑定名重试模板将注册为process-in-0-RetryTemplate. 这遵循了绑定名称的惯例(process-in-0) 后接字面- 重试模板. 在多个输入绑定的情况下,会有单独的绑定重试模板每个绑定都可用的豆子。 如果有习俗重试模板申请中可通过以下方式获得 BEANspring.cloud.stream.bindings.<binding-name>.consumer.retryTemplateName那么,它优先于任何输入绑定层的重试模板配置属性。spring-doc.cadn.net.cn

一旦重试模板从绑定注入应用后,可以用来重试应用中的关键部分。 这里有一个例子:spring-doc.cadn.net.cn

@Bean
public java.util.function.Consumer<KStream<Object, String>> process(@Lazy @Qualifier("process-in-0-RetryTemplate") RetryTemplate retryTemplate) {

    return input -> input
            .process(() -> new Processor<Object, String>() {
                @Override
                public void init(ProcessorContext processorContext) {
                }

                @Override
                public void process(Object o, String s) {
                    retryTemplate.execute(context -> {
                       //Critical business logic goes here.
                    });
                }

                @Override
                public void close() {
                }
            });
}

或者你也可以用自定义重试模板如下所示。spring-doc.cadn.net.cn

@EnableAutoConfiguration
public static class CustomRetryTemplateApp {

    @Bean
    @StreamRetryTemplate
    RetryTemplate fooRetryTemplate() {
        RetryTemplate retryTemplate = new RetryTemplate();

        RetryPolicy retryPolicy = new SimpleRetryPolicy(4);
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(1);

        retryTemplate.setBackOffPolicy(backOffPolicy);
        retryTemplate.setRetryPolicy(retryPolicy);

        return retryTemplate;
    }

    @Bean
    public java.util.function.Consumer<KStream<Object, String>> process() {

        return input -> input
                .process(() -> new Processor<Object, String>() {
                    @Override
                    public void init(ProcessorContext processorContext) {
                    }

                    @Override
                    public void process(Object o, String s) {
                        fooRetryTemplate().execute(context -> {
                           //Critical business logic goes here.
                        });

                    }

                    @Override
                    public void close() {
                    }
                });
    }
}

注意,当重试次数用尽时,默认情况下会抛出最后一个异常,导致处理器终止。 如果你想处理异常并继续处理,可以在执行方法: 这里有一个例子。spring-doc.cadn.net.cn

retryTemplate.execute(context -> {
    //Critical business logic goes here.
    }, context -> {
       //Recovery logic goes here.
       return null;
    ));

有关RetryTemplate、重试政策、退回政策等的更多信息,请参阅春季重试项目。spring-doc.cadn.net.cn