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



我有带有 spring-cassandra 的 Spring Boot 2 项目,我正在使用 @RefreshScope 在运行时创建密钥空间,并且我正在执行查询以使用该密钥空间,但模式不是从带有@Table注释的实体创建的。

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

这是我的Cassandra配置:

@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);
  }
}

这是 RefreshScope 类:

@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 + " ;");
  }

我还需要做什么才能从具有新密钥空间运行时@Table的实体自动创建架构?

Spring Data 中的模式创建 Cassandra 绑定到会话工厂 ( CassandraSessionFactoryBean ), 密钥空间创建绑定到Cluster实例 ( CassandraClusterFactoryBean )。您需要在两个工厂上都放@RefreshScope

请记住,刷新会扰乱您的 Cassandra 操作。还应注意,架构创建不适用于生产用途。它在设计时考虑了集成测试和快速应用程序开发。

相关内容

  • 没有找到相关文章

最新更新