强制 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.KafkaAdmin
的initialize()
方法时发生Fail-fast。此方法可能会阻塞:
- 如果找到新主题,它最多会阻止创建主题
operationTimeout
- 如果主题创建失败,它会阻止释放资源长达
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;
}
如果无法连接到 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.KafkaAdmin
的initialize()
方法时发生Fail-fast。此方法可能会阻塞:
- 如果找到新主题,它最多会阻止创建主题
operationTimeout
- 如果主题创建失败,它会阻止释放资源长达
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;
}