Spring Cassandra: создание схемы во время выполнения в другом пространстве ключей - PullRequest
0 голосов
/ 24 января 2019

У меня есть проект Spring Boot 2 с spring-cassandra, где я создаю пространство ключей во время выполнения с помощью @RefreshScope, и я выполняю запрос на использование этого пространства ключей, но схемы не создаются из сущности с аннотацией @Table.

Когда я запускаю приложение, создается новое пространство ключей, если оно не существует, и создается схема. После этого я меняю пространство ключей в app.properties и отправляю запрос POST в привод / обновление. Новое пространство ключей создано и используется, но схема не создается в этом пространстве ключей.

Это мой Cassandra Config:

@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 во время выполнения для нового пространства ключей?

1 Ответ

0 голосов
/ 29 января 2019

Создание схемы в Spring Data Cassandra связано с фабрикой сеансов (CassandraSessionFactoryBean), создание пространства ключей связано с экземпляром Cluster (CassandraClusterFactoryBean). Вам нужно поставить @RefreshScope на обеих фабриках.

Имейте в виду, что обновление нарушит ваши операции с Cassandra. Также следует отметить, что создание схемы не предназначено для производственного использования. Он разработан с учетом интеграционных тестов и быстрой разработки приложений.

...