Я пытаюсь реализовать резервную логику для моего соединения с Zookeeper с помощью Apache Curator, в основном у меня есть два набора строк соединения, и если я получаю состояние LOST на моем слушателе состояний, я пытаюсь повторно подключить мой клиент куратора на другомнабор строк подключения.Я мог бы просто поместить все машины в одну строку подключения, но я хочу подключиться в аварийном режиме, только когда все машины для кластера по умолчанию отключены.
Проблема заключается в том, что я не могу закрыть предыдущий клиент-куратор, когдапопробуйте перейти на резервный кластер, я получаю сообщение LOG, в котором говорится, что куратор пытается восстановить соединение, даже после подключения к резервному набору zookeepers.Ниже вы можете найти пример кода того, что я пытаюсь сделать:
final ConnectionStateListener listener = (client1, state) -> {
if (state == ConnectionState.LOST) {
reconnect();
}
};
и метод повторного подключения (изменит lastHost на резервный кластер):
if (client != null) {
client.close();
}
...
client = CuratorFrameworkFactory.newClient(
lastHost,
sessionTimeout,
connectionTimeout,
retryPolicy);
...
client.start()
Iможет успешно подключиться к новому набору строк подключения (запасной вариант), но проблема в том, что предыдущий клиент продолжает пытаться подключиться к предыдущим строкам подключения.
Глядя на метод close()
, я увидел, что куратор только закрываетсяесли у клиента состояние STARTED, думаю, именно поэтому куратор продолжает пытаться подключиться к предыдущему кластеру.
Есть ли способ закрыть () клиент куратора, не имея на нем состояния STARTED?
Если нет, есть ли другой способ реализовать эту логику (резервные серверы zookeeper) на кураторе?
Спасибо.