强制 Spring 启动应用程序在无法连接到 Kafka 时失败

Enforce Spring Boot Application to Fail When Cannot Connect to Kafka

如果无法连接到 kafka 代理,我想让我的 spring 引导应用程序在启动时失败。我的应用程序只向主题发布消息。我将此行添加到我的属性文件中,但到目前为止没有成功 spring.kafka.admin.fail-fast=true.

fail-fast 只有在上下文中至少有一个 NewTopic bean 时才会起作用(因此管理员将尝试检查主题是否存在,如果不存在则创建它)。

@SpringBootApplication
public class So55177700Application {

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

    @Bean
    public NewTopic topic() {
        return new NewTopic("so55177700", 1, (short) 1);
    }

}

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-03-15 09:42:49.555 ERROR 41793 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Could not configure topics

关于如何加速 fail-fast 的补充

TL;DR Spring Boot 2.4.5 自动配置不允许您使用 env 参数加速 fail-fast。将此添加到您的@Configuration 以获得 10 秒超时:

@Bean
public KafkaAdmin kafkaAdmin(@Autowired KafkaProperties properties) {
    KafkaAdmin kafkaAdmin = new KafkaAdmin(properties.buildAdminProperties());
    kafkaAdmin.setFatalIfBrokerNotAvailable(properties.getAdmin().isFailFast());

    /* speed up fail fast */
    kafkaAdmin.setOperationTimeout(5);
    kafkaAdmin.setCloseTimeout(5);

    return kafkaAdmin;
}

更详细的回答

当执行class org.springframework.kafka.core.KafkaAdmininitialize() 方法时发生Fail-fast。此方法可能会阻塞:

  1. 如果找到新主题,它最多会阻止创建主题 operationTimeout
    1. 如果主题创建失败,它会阻止释放资源长达 closeTimeout

默认情况下,这些值分别为 30 秒和 10 秒(硬编码在上面提到的 class 中)。您可以使用设置方法重新定义它们:setOperationTimeout(int sec)setCloseTimeout(int sec).

Spring 引导呢? KafkaAdmin bean 在 class org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration 中创建。您可以猜到,Spring 引导根本不设置超时:

@Bean
@ConditionalOnMissingBean
public KafkaAdmin kafkaAdmin() {
    KafkaAdmin kafkaAdmin = new KafkaAdmin(this.properties.buildAdminProperties());
    kafkaAdmin.setFatalIfBrokerNotAvailable(this.properties.getAdmin().isFailFast());
    return kafkaAdmin;
}