Как использовать openWithFailover() для базы данных Lotus Domino?

У меня есть некоторый код Java, который использует API Java Domino (используя NCSO.jar) для соединения с базами данных Domino через IIOP. Теперь новым требованием является то, что если сервер, к которому подключен сервер, кластеризован, должна быть возможность воспользоваться этим и переключиться на отказоустойчивый сервер в кластере, если тот, который в данный момент подключен, выходит из строя.

К сожалению, API Domino Java совершенно загадочен, с тонкими различиями между использованием API локально и удаленно через IIOP, немногими действительно ясными объяснениями и странными различиями в зависимости от аргументов, которые вы передаете методам.

Некоторую информацию мне удалось почерпнуть отсюда... Работает ли openWithFailoverMethod?

Я также проверил документацию по информационному центру IBM.

Первое, что я попробовал, было это:

Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, databaseName, false);
db.openWithFailover(host, databaseName);

Первый аргумент getDatabaseимя сервера, по-видимому, должно быть нулевым для операций IIOP. Я был довольно озадачен тем, как необходимо будет снова указать имя сервера в openWithFailover метод, когда он уже находится в сеансе, но я предполагаю, что вы можете подключиться к кластеру с сеансом, а затем указать основной сервер в методе open. Однако неясно, почему вам нужно было дважды указывать имя базы данных. В последнем аргументе говорится, что база данных не должна создаваться, если к ней нельзя получить доступ (пропустите это, и по умолчанию это правда; как замечательно).

К сожалению это выплюнуло исключение NotesException: This database object is already open as E:\Lotus\Domino\data\mail-in\EDITEST.nsf в моем лице. Это происходит на линии с openWithFailover метод.

Так что, видимо, первый звонок getDatabase уже открывает его, и нет метода close или опции, позволяющей получить объект только без его фактического открытия. Database Класс - это интерфейс, поэтому нет статических методов для получения такого объекта или способа его создания в ином случае. Я проверил вокруг, и единственная альтернатива, которую я нахожу, использует openDatabase в классе DbDirectory, Угадай, что это делает. Теперь у этого метода есть альтернатива с логическим значением, которое указывает, хотите ли вы использовать аварийное переключение, но согласно документации это всегда ложно для операций IIOP.

Согласно этой странице, вы можете получить пустой Database возражать getDatabase с двумя нулевыми аргументами. Итак, я попробовал это:

Session session = NotesFactory.createSession(host + ":" + port, user, password);
Database db = session.getDatabase(null, null, false);
db.openWithFailOver(host, databaseName);

Какая подсказка дает мне исключение NotesException: A database name must be provided, Изменение второй строки на Database db = session.getDatabase(null, null); не имеет значения.

Я могу только предположить, что имя базы данных является обязательным для удаленных операций? Но тогда как вообще использовать аварийное переключение при удаленном соединении? Или я делаю это неправильно? Может быть, мне следует подключиться к кластеру, а не к самому серверу, и аварийное переключение обрабатывается автоматически? Или отказоустойчивость просто невозможна для удаленных подключений? Клиент Notes может сделать это, поэтому я ожидаю, что это будет возможно в вашем собственном коде Java.

Кто-нибудь, пожалуйста, помогите мне здесь, потому что документация просто не предоставляет достаточно информации.

1 ответ

Решение

Нет ничего плохого в API. Это просто тот случай, когда отказоустойчивость кластера в Lotus Notes и Domino разработана для проприетарного сетевого протокола Domino (NRPC). Клиент Notes использует NRPC. Вот почему это может сделать аварийное переключение. Java-код, который использует notes.jar вместо NCSO.jar, тоже может это сделать, потому что он также использует NRPC - и некоторую информацию о конфигурации клиента Notes под прикрытием.

Но он не будет работать с NCSO.jar, потому что он использует IIOP.

Вот почему это так. В общем, стандартные протоколы ничего не знают ни о каком типе кластеризации. Решения для кластеризации этих стандартных протоколов в значительной степени основаны на каком-либо сетевом устройстве высокой доступности, которое направляет трафик на различные серверы в кластере. Но в отличие от кластерных решений для стандартных протоколов, кластеризация Domino работает без какого-либо внешнего устройства балансировки нагрузки / отказоустойчивого устройства в сети. Итак, если сервер Domino находится в кластере, но он не отвечает, как клиент Notes узнает адрес другого сервера, на который нужно переключиться? Там нет устройства с гаишником, с которым можно поговорить, и, очевидно, он не может спросить сервер, потому что он не отвечает. Поэтому он должен посмотреть информацию о конфигурации, которая уже была сохранена локально, чтобы сказать, какие другие серверы с репликами целевой базы данных доступны! Эта информация хранится в основных DLL-библиотеках Notes, которые являются частью установки клиента Notes, поэтому для ее работы необходимо установить клиент Notes. Но когда вы используете NCSO.jar, не предполагается, что существует локальный клиент Notes. Даже если у вас установлен клиент Notes, NCSO.jar не знает об этом. Таким образом, классы API Java Notes на основе IIOP не могут узнать, где искать любую информацию о доступных серверах в кластере Domino.

Существует нечто, называемое Domino Internet Cluster Manager, которое работает для аварийного переключения Domino HTTP, но я не думаю, что оно также поддерживает IIOP. Хотя я не уверен в этом, так что вы можете посмотреть на это. Но я думаю, что если вы хотите использовать аварийное переключение IIOP, вам, вероятно, придется добавить стороннее решение балансировки нагрузки / кластеризации в вашу сеть. Хорошая новость в том, что вам, вероятно, не понадобятся какие-либо специальные API, чтобы воспользоваться этим. Или, если у вас нет кластерного решения, которое поддерживает IIOP в вашей сети, и вы не можете добавить его, вы можете просто запрограммировать свой код для работы с несколькими серверами. Напишите свой код так, чтобы вместо одного запрограммированного имени / адреса сервера у него было несколько, и попробуйте открыть базу данных на них по порядку, пока вы не добьетесь успеха.

Другие вопросы по тегам