Воссоздание пространства ключей на Datastax Cassandra после повторного создания контейнера docker в Spring Boot Application - PullRequest
0 голосов
/ 18 марта 2020

Я использую Datastax Cassandra в Spring Boot Application и использую следующую конфигурацию для настройки кластера:

@Configuration
@EnableScheduling

public class CassandraConfig extends AbstractCassandraConfiguration {

 @Value("${cassandra.server}")
private String cassandraServer;

@Value("${cassandra.port}")
private int cassandraPort;



@Override
@Bean
protected String getKeyspaceName() {
    return this.cassandraKeyspace;
}

 @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster =
                new RetryingCassandraClusterFactoryBean();
        cluster.setContactPoints(this.cassandraServer);
        cluster.setPort(this.cassandraPort);
        cluster.setJmxReportingEnabled(false);
        if (getSchemaAction().equals(SchemaAction.RECREATE_DROP_UNUSED)) {
            cluster.setKeyspaceDrops(Arrays.asList(DropKeyspaceSpecification.dropKeyspace(getKeyspaceName()).ifExists()));
            cluster.setKeyspaceCreations(Arrays.asList(CreateKeyspaceSpecification.createKeyspace(getKeyspaceName()).ifNotExists()));
        } else {
            cluster.setKeyspaceCreations(Arrays.asList(CreateKeyspaceSpecification.createKeyspace(getKeyspaceName()).ifNotExists()));
        }

        return cluster;
    }
}

public class RetryingCassandraClusterFactoryBean extends CassandraClusterFactoryBean {
private static final Logger LOG =
        LoggerFactory.getLogger(RetryingCassandraClusterFactoryBean.class);
@Override
public void afterPropertiesSet() throws Exception {
    connect();
}
private void connect() throws Exception {
    try {
        super.afterPropertiesSet();
    } catch (TransportException | IllegalArgumentException | NoHostAvailableException e) {
        LOG.warn(e.getMessage());
        LOG.warn("Retrying connection in 10 seconds");
        sleep();
        connect();
    }
}
private void sleep() {
    try {
        Thread.sleep(10000);
    } catch (InterruptedException ignored) {
    }
}

}

Cassandra работает на образе docker на местном уровне. Если я запускаю сервер после запуска Cassandra, то мое пространство ключей создается из-за инициализации bean-компонента, но если я воссоздаю контейнер Cassandra docker и запускаю его (с включенным сервером), то каждый запрос не будет выполнен из-за несуществующего пространства ключей. Как я могу воссоздать пространство ключей после восстановления соединения без перезапуска сервера? Я искал обработчик, но не нашел его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...