设置 Ldap 操作的超时

当 Client 端向服务器发出 LDAP 请求并且服务器由于某种原因没有响应时,Client 端将永远 await 服务器响应,直到 TCP 超时为止。在 Client 端,用户体验本质上是过程挂起。为了及时控制 LDAP 请求,自 Java SE 6 起,可以为 JNDI/LDAP 服务提供者配置读取超时。

新环境属性:

com.sun.jndi.ldap.read.timeout

可以用于指定 LDAP 操作的读取超时。此属性的值是整数的字符串 表示形式,该整数表示 LDAP 操作的读取超时(以毫秒为单位)。如果 LDAP 提供程序在指定时间段内未收到 LDAP 响应,它将中止读取try。整数应大于零。小于或等于零的整数表示未指定读取超时,这等同于无限期地 await 响应,直到接收到响应为止(默认为原始行为)。

如果未指定此属性,则默认值为 await 响应,直到收到响应为止。
例如,如果服务器在 5 秒钟内未回复答复,则env.put("com.sun.jndi.ldap.read.timeout", "5000");将导致 LDAP 服务提供者中止读取try。

这是一个示例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 绑定请求。Client 端超时,await 服务器的响应。

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 响应。