我在我的应用程序中使用了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)
,则没有区别。我将测试你稍后提到的其他事情。
答案 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调试,这将会很有帮助。 ”。如果在尝试执行关闭时以某种方式捕获异常,则启用调试应该使其可见,以便我们可以更好地了解正在发生的事情。
尼尔