Я использую Spring Data с Cassandra и хотел бы быть максимально устойчивым с точки зрения предотвращения и обработки ошибок. В настоящее время мы обертываем наш наш com.datastax.cassandra.Session, реализуя интерфейс с нашей собственной реализацией, которая создает вложенный экземпляр (фактически прокси), например:

private class CassandraSessionProxy implements Session {
    private Session cassandraSession;
    private Session cassandraSession() {
        if (cassandraSession != null) {
            return cassandraSession;
        } else {
            synchronized (this) {
                try {
                    cassandraSession = createCassandraSession();
                    return cassandraSession;
                } catch (Exception e) {
                    LOGGER.error("An error happened but after Spring's container started", e);
                }
            }
        }
    }
    // implement Session methods, proxying to cassandraSession field
    @Override
    public void close() {
        cassandraSession().close();
    }
}

Все методы проксирования в нашей реализации Session получают доступ к полю cassandraSession через синхронизированный блок, который проверяет, существует ли оно, и, если нет, создает соединение, перехватывая любые исключения, выходящие за рамки запуска Spring.

Любопытно, есть ли более гладкий метод для достижения этого. Упущенная из виду функция родного драйвера datastax или spring-data была бы идеальной.

Весьма признателен :)

3
adam 19 Фев 2015 в 19:32
 – 
Raedwald
20 Фев 2015 в 10:58
В отличие от этого сценария, исключение носит временный характер, и я хочу, чтобы приложение по-прежнему запускалось и работало нормально, когда Кассандра вернется в сеть.
 – 
adam
20 Фев 2015 в 19:25

2 ответа

Сессия — это интерфейс. Почему бы вам просто не создать SessionBuilder, который создает экземпляр Session? Затем вы можете заставить его вернуть базовый сеанс Cassandra, пока вам не понадобится что-то еще.

Приведенное выше решение обычно является лучшей практикой, когда дело доходит до объектно-ориентированного проектирования.

1
Ztyx 20 Фев 2015 в 10:34
Сессия Cassandra выдает ошибку, которая останавливает запуск Spring.
 – 
adam
20 Фев 2015 в 19:23

Вы неправильно используете синхронизацию. Ваша проверка на нуль не является частью какого-либо потока, происходящего до того, как результаты не гарантируются.

Вместо этого я бы использовал статический держатель или вообще не использовал ленивую инициализацию.

-1
relgames 10 Сен 2015 в 15:09