Unboundid InMemory LDAP SDK - 服务器不会关闭

时间:2011-11-10 12:41:27

标签: ldap unboundid-ldap-sdk directory-server

我在我的应用程序中使用了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 个答案:

答案 0 :(得分: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调试,这将会很有帮助。 ”。如果在尝试执行关闭时以某种方式捕获异常,则启用调试应该使其可见,以便我们可以更好地了解正在发生的事情。

尼尔