我有一个使用 Spring Data for Cassandra 的 Spring Boot 应用程序。其中一个要求是,即使 Cassandra 集群不可用,应用程序也会启动。应用程序记录情况,其所有端点将无法正常工作,但应用程序不会关闭。在此期间,它应重试连接到群集。当群集可用时,应用程序应开始正常运行。如果我能够在应用程序启动期间连接,并且集群在此之后变得不可用,则 cassandra java 驱动程序能够管理重试。如何在应用程序启动期间管理重试,同时仍然使用 Spring Data 中的 Cassandra 存储库?
感谢
如果 Apache Cassandra 不可用,则可以启动 Spring Boot 应用程序,但您需要定义 Session
并使用 @Lazy
自行CassandraTemplate
bean。Bean 开箱即用,带有CassandraAutoConfiguration
但被急切地初始化(默认行为),这会创建一个Session
。Session
需要连接到 Cassandra,如果它没有延迟初始化,这将阻止启动。
以下代码将延迟初始化资源:
@Configuration
public class MyCassandraConfiguration {
@Bean
@Lazy
public CassandraTemplate cassandraTemplate(@Lazy Session session, CassandraConverter converter) throws Exception {
return new CassandraTemplate(session, converter);
}
@Bean
@Lazy
public Session session(CassandraConverter converter, Cluster cluster,
CassandraProperties cassandraProperties) throws Exception {
CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
session.setCluster(cluster);
session.setConverter(converter);
session.setKeyspaceName(cassandraProperties.getKeyspaceName());
session.setSchemaAction(SchemaAction.NONE);
return session.getObject();
}
}
其中一个要求是,即使 Cassandra 集群不可用,应用程序也会启动。
我认为您应该从 Java 驱动程序文档中阅读此会话:http://datastax.github.io/java-driver/manual/#cluster-initialization
除非执行某些调用,否则Cluster
对象不会自动连接。
由于您使用的是Spring Data Cassandra(我不建议这样做,因为它的功能比Java驱动程序的普通映射器模块少...我不知道Cluster
对象或Session
对象是否直接暴露给用户......
对于重试,您可以将cluster.init()
调用放在 try/catch 块中,如果集群仍然不可用,您将根据文档捕获NoHostAvailableException
。出现异常时,您可以安排稍后重试cluster.init()