0

由于 Spring boot 2.3 版本中对 docker 镜像支持的改进,我们决定迁移到这个版本。在我们的项目中,我们使用 Cassandra 作为数据库之一。但是除了迁移到 cassandra 驱动程序版本 4 之外,spring data cassandra 似乎发生了很多变化。问题是这个不允许应用程序启动的异常,

 java.lang.IllegalStateException: Since you provided explicit contact points, the local DC must be explicitly set (see basic.load-balancing-policy.local-datacenter in the config, or set it programmatically with SessionBuilder.withLocalDatacenter)

现在,我在网上搜索并发现有人建议:

将此属性添加到我的 application.properties:

spring.data.cassandra.local-datacenter=datacenter1 (in my case since in the exception that it throws, it's mentioned that the local datacenter is - datacenter1)

并在创建 CqlSession bean 时指定它,我正在这样做:

public CqlSession session() {

     String containerIpAddress = getContactPoints();
     int containerPort = getPort();
     InetSocketAddress containerEndPoint = new InetSocketAddress(containerIpAddress, containerPort);

    return CqlSession.builder().withLocalDatacenter(getLocalDataCenter())
            .addContactPoint(containerEndPoint)
            .withAuthCredentials(dbProperties.getCassandraUserName(), dbProperties.getCassandraPassword())
            .withKeyspace(getKeyspaceName()).build(); }

但是我仍然被卡住并且无法启动应用程序。如何解决这个问题?

4

3 回答 3

0

使用此配置对我有用

public CqlSession session() {
        return CqlSession.builder().withLocalDatacenter(getLocalDataCenter())
                .addContactPoint(InetSocketAddress.createUnresolved(getContactPoints(), 9042))
                //.withAuthCredentials(dbProperties.getCassandraUserName(), dbProperties.getCassandraPassword())
                .withKeyspace(getKeyspaceName()).build();
    }


@Bean
    @ConditionalOnMissingBean
    public CassandraTemplate cassandraTemplate(CqlSession session) throws Exception {
        return new CassandraTemplate(session);
    }
于 2020-08-20T11:24:45.413 回答
0

我正在使用 Reactive Cassandra,但基本相同。可以通过登录到您的 cassandra 实例并运行

select data_center from system.local;

至于我的配置,它看起来像这样:

@Configuration
@EnableReactiveCassandraRepositories
public class CassandraConfig {

  @Value("${spring.data.cassandra.contact-points}")
  private String hostList;

  @Value("${spring.data.cassandra.datacenter}")
  private String datacenter;

  @Value("${spring.data.cassandra.keyspace-name}")
  private String keyspaceName;

  @Value("${spring.data.cassandra.username}")
  private String userName;

  @Value("${spring.data.cassandra.password}")
  private String password;

  @Value("${spring.data.cassandra.port}")
  private Integer port;

  @Bean
  public CqlSessionFactoryBean getCqlSession() {
    CqlSessionFactoryBean factory = new CqlSessionFactoryBean();
    factory.setUsername(userName);
    factory.setPassword(password);
    factory.setPort(port);
    factory.setKeyspaceName(keyspaceName);
    factory.setContactPoints(hostList);
    factory.setLocalDatacenter(datacenter);
    return factory;
  }

}
于 2020-07-20T20:27:36.950 回答
0

实际上,Apache Cassandra 需要不同的配置才能真正使用新的 Spring 版本。我花了大约 50 个小时的搜索才在本文档中找到了这一点 - https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.cassandra-java-config

您需要创建一个在那里指定的新配置文件。为此,请执行以下操作:

创建一个名为的新包config 在名为的包中创建一个 .java 类文件 -CassandraConfig 将以下代码复制并粘贴到其中。

@Configuration public class CassandraConfig { public @Bean CqlSession session() { return CqlSession.builder().withKeyspace("mykeyspacename").build(); } }

请注意,将 Keyspace 名称更改为您在属性文件中定义的 Keyspace 名称。如果您还没有创建 Keyspace,请在您的系统上启动 Cassandra 服务器,cqlsh通过发出 登录到终端或 cmd cqlsh,然后发出以下命令 -

CREATE KEYSPACE IF NOT EXISTS mykeyspacename WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } AND DURABLE_WRITES = true ;

到目前为止,当您启动 spring boot 应用程序时,它应该可以正常运行。

于 2021-05-08T16:47:35.550 回答