这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中更新的语言特性的概述。
请参阅JDK发布说明,了解所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
当客户端向服务器发出LDAP请求,而服务器由于某种原因没有响应时,客户端会一直等待服务器响应,直到TCP超时。在客户端上,用户所经历的实质上是一个进程挂起的过程。为了及时控制LDAP请求,可以为JNDI/LDAP服务提供者配置读取超时,自Java SE 6开始。
新的环境属性:
com.sun.jndi.ldap.read.timeout
可以用于指定LDAP操作的读取超时时间。该属性的值是表示LDAP操作的读取超时时间的毫秒数的整数的字符串表示。如果LDAP提供者在指定的时间内未收到LDAP响应,则中止读取尝试。整数值应大于零。小于或等于零的整数表示未指定读取超时,即等待响应直到无限期收到,默认为原始行为。
如果未指定此属性,默认情况下等待响应直到收到响应。
例如,env.put("com.sun.jndi.ldap.read.timeout", "5000");
会导致LDAP服务提供者在服务器未在5秒内响应时中止读取尝试。
下面是一个示例,ReadTimeoutTest
,它使用一个不响应LDAP请求的虚拟服务器来展示设置非零值时该属性的行为。
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put("com.sun.jndi.ldap.read.timeout", "1000"); env.put(Context.PROVIDER_URL, "ldap://localhost:2001"); Server s = new Server(); try { // start the server s.start(); // Create initial context DirContext ctx = new InitialDirContext(env); System.out.println("LDAP Client: Connected to the Server"); : : } catch (NamingException e) { e.printStackTrace(); }
上述程序会打印下面的堆栈跟踪,因为当创建InitialDirContext时,服务器甚至不会响应LDAP绑定请求。客户端在等待服务器响应时超时。
Server: Connection accepted javax.naming.NamingException: LDAP response read timed out, timeout used:1000ms. : : at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:82) at ReadTimeoutTest.main(ReadTimeoutTest.java:32)
请注意,该属性与另一个环境属性com.sun.jndi.ldap.connect.timeout不同,后者设置与服务器建立连接的超时时间。读取超时适用于在与服务器建立初始连接后从服务器接收的LDAP响应。