即使Cassandra失败,如何加载spring应用程序上下文

时间:2015-11-16 22:14:14

标签: spring-data spring-data-cassandra

使用时

@Configuration
@EnableCassandraRepositories(basePackages={"com.foo"})
public class CassandraConfig{
@Bean
    public CassandraClusterFactoryBean cluster()
    {

        final CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
        cluster.setContactPoints(nodesRead);
        cluster.setPort(port);

        return cluster;
    }

com.foo包中有一个扩展CrudRepository的接口。

有没有办法让它在启动时如果数据库关闭则不会抛出异常?

理想情况下,我们启动并且无论何时在存储库上调用方法,它都会首先尝试连接到数据库,然后如果数据库仍然关闭,则返回错误,指出无法连接。

我目前观察到的行为是抛出NoHostAvailableException并且Web容器无法启动。

1 个答案:

答案 0 :(得分:2)

我能够想出一个解决方案。我从存储库中删除了@EnableCassandraRepositories(basePackages = {“com.foo”})注释,并在我的Config中定义了一个将返回我的存储库的Bean。删除EnableCassandraRepositories允许延迟加载存储库。我的Config中的这个新bean允许我使用RepositoryFactorySupport getRepository()方法实例化我的存储库。我将这个bean注释为lazy,并确保对bean的引用也很懒惰。

假设我的存储库如下所示

public interface IBarRepository extends CrudRepository<Bar, BarKey>{}

我的配置文件现在看起来像

@Configuration

public class CassandraConfig{
@Bean
@Lazy(value=true)
public IBarRepository barRepository() throws Exception    
{
  final RepositoryFactorySupport support = CassandraRepositoryFactory(cassandraTemplate());
  return support.getRepository(IBarRepository.class); 
}
@Bean
@Lazy(value=true)
public CassandraClusterFactoryBean cluster()
{

    final CassandraClusterFactoryBean cluster = new   CassandraClusterFactoryBean();
    cluster.setContactPoints(nodesRead);
    cluster.setPort(port);

    return cluster;
}
//More beans down here defining things like cluster, mappingContext, session, etc.