Я использую 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 и запускаю его (с включенным сервером), то каждый запрос не будет выполнен из-за несуществующего пространства ключей. Как я могу воссоздать пространство ключей после восстановления соединения без перезапуска сервера? Я искал обработчик, но не нашел его.