2016-03-04 2 views
2

У нас есть большое веб-приложение на Java, которое использует Gemfire и spring-data-gemfire. Мы запускаем gemfire в конфигурации клиентского сервера.Ввод в эксплуатацию источника данных весны-данных без локатора

У нас возникает следующая проблема: во время запуска, на фазе проводки фаз, пружинный источник данных gemfire хочет подключиться к локатору gemfire. Однако локатор может быть не включен. Затем приложение выкинет исключение com.gemstone.gemfire.cache.NoSubscriptionServersAvailableException: Primary discovery failed.

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

Есть ли хорошее решение, чтобы клиент подождал и периодически проводил опрос до тех пор, пока локатор не будет работать?

+1

Возможно, вы захотите попробовать установить свойство GemFire ​​'locator-wait-time'. Я считаю, что это было введено в 8.1 и позволяет серверу подождать указанное время, чтобы локатор стал доступен. –

ответ

3

Jens D комментарии, вы можете попробовать locator-wait-time GemFire ​​(System). Однако, как указывает documentation ...

Число секунд, что член должен ждать для локатора, чтобы начать, если локатор не доступен при попытке присоединиться к распределенной системе. Используйте этот параметр при запуске локаторов и сверстников одновременно. Этот тайм-аут позволяет сверстникам дождаться, когда локаторы закончат запуск, прежде чем пытаться присоединиться к распределенной системе.

Это конкретно относится к «равноправному члену», соединяющему распределенную систему/кластер и, следовательно, может не иметь никакого эффекта от клиента (кеша).

В этом случае я использовал другие методы, используя Spring (в частности, в тестах интеграции, включающих топологию клиент/сервер), чтобы заставить клиент блокировать ожидание появления сервера (или локатора). В моих тестах тест запускает отдельный JVM-процесс GemFire ​​для запуска сервера, в то время как тестовая VM служит клиентом кэша.

Вы можете увидеть примеры этого в моих последних усилиях по разработке, объединив GemFire ​​с Spring Session, в частности, в образце httpsession-gemfire-clientserver.

Здесь я использовал BeanPostProcessor, что приводит к тому, что кэш клиента, а конкретно PoolFactoryBean/Pool, чтобы заблокировать (в postProcessBeforeInitialization(..)) предотвращение пула не полностью инициализирован, пока сервер не доступен (может также применяться к Locator).

wait только attempts to open a Socket connection to the Server (или локатор) для проверки возможности подключения.

Другой подход заключается в create a CountDownLatch, использовать его в registered GemFire ClientMembershipListener и объединить его с, опять же, в BeanPostProcessor только в postProcessAfterInitialization(..) методе этот раз.

Технически необходимо использовать только один из двух подходов. Хотя, я использовал это для тестирования, это может быть использовано и не является редкостью для реального приложения.

В идеале, однако, вы начинаете свои локаторы раньше всего, так как от этого зависит создание кластера.

Надеюсь, это поможет.

Cheers! John

Смежные вопросы