Unboundid InMemory LDAP SDK - сервер не выключится
Я использую Unboundid In-Memory Directory Server в своем приложении, и до сих пор он отлично работает (нравится намного больше, чем Apache DS). Но когда мое приложение готово и я хочу завершить работу сервера, оно, похоже, "зависает", то есть выполняется команда shutDown(), но поток не останавливается.
InMemoryDirectoryServerConfig configuration = new InMemoryDirectoryServerConfig(baseDNs);
configuration.setListenerConfigs(InMemoryListenerConfig.createLDAPConfig("default", port));
configuration.setSchema(null);
server = new InMemoryDirectoryServer(configuration);
server.startListening();
LDAPConnection ldapConnection = new LDAPConnection("localhost", PORT);
// lots of processing the LDAP data
ldapConnection.close();
server.shutDown("default", true);
Он выполняется без исключения или чего-то еще, но все равно не закрывается.
Самое смешное, что если я выполню приведенный выше код без обработки, это сработает.
РЕДАКТИРОВАТЬ
Кодирование обработки в основном вызывает ldapConnection.search()
а также ldapConnection.getEntry()
несколько раз, чтобы получить некоторую информацию о пользователях и группах. Затем он создает объекты, используя эту информацию, а затем вставляет их в БД.
РЕДАКТИРОВАТЬ 2
Нет разницы, если shutDown("default",true)
или же shutDown(true)
называется. Я собираюсь проверить другие вещи, которые вы упомянули позже.
1 ответ
Я никогда не слышал, чтобы кто-то еще сообщал о проблеме с отключением сервера каталогов в памяти. Что именно вы имеете в виду, не закрыл? Вы имеете в виду, что все еще работают один или несколько потоков? Это все еще принимает соединения от клиентов LDAP? Существующие соединения все еще установлены? Проблема возникает постоянно или только время от времени? Видите ли вы разницу в поведении, если вы вызываете shutDown(true) для выключения всех слушателей, а не shutDown("default",true), чтобы попытаться отключить только прослушиватель "по умолчанию"?
Если кажется, что один или несколько потоков все еще работают, не могли бы вы предоставить трассировку стека всех активных потоков? Вы можете получить это, используя команду jstack или отправив "kill -3" процессу JVM. Также было бы полезно, если бы вы могли включить отладку LDAP SDK, установив для свойства com.unboundid.ldap.sdk.debug.enabled значение true при запуске JVM или вызвав com.unboundid.util.Debug.setEnabled(true). ". Если при попытке завершить работу каким-либо образом обнаруживается исключение, то включение отладки должно сделать это видимым, чтобы мы могли лучше понять, что происходит.
Нил