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

时间:2019-03-15 07:36:24

标签: spring spring-boot apache-kafka kafka-producer-api spring-kafka

如果我的spring boot应用程序无法连接到kafka代理,我想使其启动失败。我的应用程序仅将消息发布到主题。我已将此行添加到属性文件中,但到目前为止spring.kafka.admin.fail-fast=true还没有运气。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

TL;DR Spring Boot 2.4.5 自动配置不允许您使用 env 参数加速快速失败。将此添加到您的 @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;
}

更详细的答案

Fail-fast 在执行类 initialize()org.springframework.kafka.core.KafkaAdmin 方法时发生。此方法可能会阻塞:

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

默认情况下,这些值分别为 30 和 10 秒(在上述类中硬编码)。您可以使用 set 方法重新定义它们:setOperationTimeout(int sec)setCloseTimeout(int sec)

Spring Boot 怎么样? KafkaAdmin bean 在类 org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration 中创建。您可以猜到,Spring Boot 根本不设置超时:

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