Dim*_*tri 1 spring cassandra spring-data spring-boot spring-data-cassandra
我将 Spring Boot 和 Spring Data 与 Cassandra 一起使用。在应用程序启动时,spring 建立到数据库的连接以设置模式并初始化 spring 数据存储库。如果数据库不可用,应用程序将不会启动。
我希望应用程序只记录一个错误并启动。当然,我不能再使用存储库,但其他独立于数据库的服务(其余控制器等)应该可以工作。也很高兴在执行器健康检查中看到 cassandra 已关闭。
对于 JDBC,有一个spring.datasource.continue-on-error属性。我找不到与 Cassandra 类似的东西。
我还尝试创建自定义 cassandra 配置并尝试在 CqlSession 创建时捕获异常,但我无法实现所需的行为。
编辑:正如@adutra 所建议的,我尝试设置advanced.reconnect-on-init,应用程序尝试建立连接,但应用程序未完全初始化(例如无法访问 REST 控制器)
@Configuration
public class CustomCassandraConfiguration extends CassandraAutoConfiguration {
@Bean
public DriverConfigLoaderBuilderCustomizer driverConfigLoaderBuilderCustomizer() {
return builder -> builder.withBoolean(DefaultDriverOption.RECONNECT_ON_INIT, true);
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:我现在有工作示例(应用程序启动,cassandra 的自定义健康检查),但如果感觉很丑陋:
自定义Cassandra自动配置
@Configuration
public class CustomCassandraConfiguration extends CassandraAutoConfiguration {
@Bean
public DriverConfigLoaderBuilderCustomizer driverConfigLoaderBuilderCustomizer() {
return builder -> builder.withBoolean(DefaultDriverOption.RECONNECT_ON_INIT, true);
}
}
Run Code Online (Sandbox Code Playgroud)
自定义CassandraDataAutoConfiguration
@Configuration
public class CustomCassandraAutoConfiguration extends CassandraAutoConfiguration {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
@Bean
public CqlSession cassandraSession(CqlSessionBuilder cqlSessionBuilder) {
try {
return super.cassandraSession(cqlSessionBuilder);
} catch (AllNodesFailedException e) {
logger.error("Failed to establish the database connection", e);
}
return new DatabaseNotConnectedFakeCqlSession();
}
@Bean
public CassandraReactiveHealthIndicator cassandraHealthIndicator(ReactiveCassandraOperations r, CqlSession session) {
if (session instanceof DatabaseNotConnectedFakeCqlSession) {
return new CassandraReactiveHealthIndicator(r) {
@Override
protected Mono<Health> doHealthCheck(Health.Builder builder) {
return Mono.just(builder.down().withDetail("connection", "was not available on startup").build());
}
};
}
return new CassandraReactiveHealthIndicator(r);
}
}Run Code Online (Sandbox Code Playgroud)
DatabaseNotConnectedFakeCqlSession(假会话实现)
@Configuration
public class CustomCassandraDataAutoConfiguration extends CassandraDataAutoConfiguration {
public CustomCassandraDataAutoConfiguration(CqlSession session) {
super(session);
}
@Bean
public SessionFactoryFactoryBean cassandraSessionFactory(CqlSession session, Environment environment, CassandraConverter converter) {
SessionFactoryFactoryBean sessionFactoryFactoryBean = super.cassandraSessionFactory(environment, converter);
// Disable schema action if database is not available
if (session instanceof DatabaseNotConnectedFakeCqlSession) {
sessionFactoryFactoryBean.setSchemaAction(SchemaAction.NONE);
}
return sessionFactoryFactoryBean;
}
}Run Code Online (Sandbox Code Playgroud)
有什么建议?
您可以将该选项设置datastax-java-driver.advanced.reconnect-on-init为 true 以达到您想要的效果。它的用法在驱动程序文档的配置参考页面中有解释:
如果在第一次初始化尝试时所有联系点都无法访问,是否安排重新连接尝试。如果这是真的,驱动程序将根据重新连接策略重试。该
SessionBuilder.build()呼叫-或者返回的未来SessionBuilder.buildAsync()-将无法完成,直到接触点已经达到。如果这是错误的并且没有可用的接触点,则驱动程序将失败并显示AllNodesFailedException.
但是要小心:如上所述,将此选项设置为 true 时,任何尝试访问CqlSessionbean 的组件,即使会话 bean 是惰性的,也将阻塞,直到驱动程序能够连接为止,如果接触点是,则可能永远阻塞错误的。
如果这对您来说是不可接受的,我建议您将CqlSessionbean包装在另一个 bean 中,该bean 将检查返回的未来SessionBuilder.buildAsync()是否完成,并根据调用者的期望阻止、抛出或返回 null。
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |