|
对于最新稳定版本,请使用 spring-cloud-stream 5.0.0! |
重试关键业务逻辑
在某些情况下,你可能需要重试对应用至关重要的业务逻辑部分。比如外部调用关系数据库,或从 Kafka Streams 处理器调用 REST 端点。这些调用可能因网络问题或远程服务不可用等多种原因而失败。但更常见的是,如果你能再试一次,这些失败可能会自行解决。默认情况下,Kafka Streams 的绑定器会创建重试模板所有输入绑定都用豆子。
如果函数的签名如下,
@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那么,它优先于任何输入绑定层的重试模板配置属性。
一旦重试模板从注入到应用程序的绑定后,可以用来重试应用程序中的关键部分。这里有一个示例:
@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() {
}
});
}
或者你也可以用自定义重试模板如下所示。
@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() {
}
});
}
}
注意,当重试用尽时,默认情况下会抛出最后一个异常,导致处理器终止。如果你想处理该异常并继续处理,可以在执行方法: 这里有一个例子。
retryTemplate.execute(context -> {
//Critical business logic goes here.
}, context -> {
//Recovery logic goes here.
return null;
));
有关RetryTemplate、重试政策、退回政策等的更多信息,请参阅春季重试项目。