0

我在我的应用程序中使用 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)调用没有区别。我将测试您稍后提到的其他内容。

4

1 回答 1

1

我从未听过其他人报告内存目录服务器未关闭的问题。不会关闭到底是什么意思?你的意思是还有一个或多个线程仍在运行?它仍然接受来自 LDAP 客户端的连接吗?现有的连接是否仍然建立?问题是持续出现还是偶尔出现?如果您调用 shutDown(true) 来关闭所有侦听器,而不是调用 shutDown("default",true) 来尝试仅关闭“默认”侦听器,您会发现行为有什么不同吗?

如果看起来一个或多个线程仍在运行,您能否提供所有活动线程的堆栈跟踪?您应该能够使用 jstack 命令或通过向 JVM 进程发送“kill -3”来获得它。如果您可以通过在启动 JVM 时将 com.unboundid.ldap.sdk.debug.enabled 属性设置为 true 或调用“com.unboundid.util.Debug.setEnabled(true)”来启用 LDAP SDK 调试,这也会很有帮助”。如果在尝试执行关闭时以某种方式捕获了异常,则启用调试应该使其可见,以便我们更好地了解正在发生的事情。

尼尔

于 2011-11-10T16:59:27.503 回答