Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Cassandra:在运行时在另一个键空间中创建模式_Spring_Spring Boot_Cassandra_Spring Data_Spring Data Cassandra - Fatal编程技术网

Spring Cassandra:在运行时在另一个键空间中创建模式

Spring Cassandra:在运行时在另一个键空间中创建模式,spring,spring-boot,cassandra,spring-data,spring-data-cassandra,Spring,Spring Boot,Cassandra,Spring Data,Spring Data Cassandra,我有一个SpringCassandra的SpringBoot2项目,我在运行时使用@RefreshScope创建键空间,并执行查询以使用该键空间,但模式不是从带有@Table注释的实体创建的 启动应用程序时,如果不存在新的键空间,则会创建一个新的键空间,并创建模式。之后,我更改app.properties中的键空间,并将POST请求发送到执行器/刷新。将创建并使用新的键空间,但不会在该键空间中创建架构 这是我的卡桑德拉配置: @Configuration @EnableCassandraRepo

我有一个SpringCassandra的SpringBoot2项目,我在运行时使用@RefreshScope创建键空间,并执行查询以使用该键空间,但模式不是从带有@Table注释的实体创建的

启动应用程序时,如果不存在新的键空间,则会创建一个新的键空间,并创建模式。之后,我更改app.properties中的键空间,并将POST请求发送到执行器/刷新。将创建并使用新的键空间,但不会在该键空间中创建架构

这是我的卡桑德拉配置:

@Configuration
@EnableCassandraRepositories
public class CassandraConfig extends AbstractCassandraConfiguration {

  @Value("${cassandra.port}")
  private int cassandraPort;
  @Value("${cassandra.keyspace}")
  private String KEYSPACE;
  @Value("${cassandra.contactpoints}")
  private String NODES;

  @Bean
  @Override
  public CassandraCqlClusterFactoryBean cluster() {
    CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean();
    bean.setKeyspaceCreations(getKeyspaceCreations());
    bean.setContactPoints(NODES);
    bean.setPort(cassandraPort);
    return bean;
  }

  @Override
  public SchemaAction getSchemaAction() {
    return SchemaAction.CREATE_IF_NOT_EXISTS;
  }

  @Override
  protected String getKeyspaceName() {
    return KEYSPACE;
  }

  @Override
  protected String getContactPoints() {
    return NODES;
  }

  @Override
  protected int getPort() {
    return cassandraPort;
  }

  @Override
  public String[] getEntityBasePackages() {
    return new String[] {"package.entities"};
  }

  @Override
  protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    List<CreateKeyspaceSpecification> createKeyspaceSpecifications = new ArrayList<>();
    createKeyspaceSpecifications.add(getKeySpaceSpecification());
    return createKeyspaceSpecifications;
  }

  // Below method creates "keyspace" if it doesn't exist.
  private CreateKeyspaceSpecification getKeySpaceSpecification() {
    DataCenterReplication dcr = DataCenterReplication.of("datacenter1", 3L);
    return CreateKeyspaceSpecification.createKeyspace(KEYSPACE)
        .ifNotExists()
        .withNetworkReplication(dcr);
  }
}

我还需要做些什么才能在运行时使用@Table从实体中为新的键空间自动创建模式?

Spring数据中的模式创建Cassandra绑定到会话工厂(
CassandraSessionFactoryBean
),键空间创建绑定到
集群
实例(
CassandraClusterFactoryBean
)。您需要在这两个工厂上放置
@RefreshScope


请记住,刷新将中断您的Cassandra操作。您还应该注意,模式创建并非用于生产。它的设计考虑到了集成测试和快速应用程序开发。

是否将这些添加到上面的CassandraConfig或MySessionRefresh类中?你怎么知道的?有相关文档的链接吗?我正在与一个类似的问题作斗争。
@Component
class MySessionRefresh extends AbstractCassandraConfiguration{

  @Autowired
  Environment env;

  @Autowired
  Session session;

  @EventListener
  @Order(Ordered.HIGHEST_PRECEDENCE)
  public void handle(RefreshScopeRefreshedEvent event) {

    String keyspace = env.getProperty("cassandra.keyspace");
    session.execute("CREATE KEYSPACE IF NOT EXISTS " + keyspace + " WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };");
    session.execute("USE " + keyspace + " ;");

  }