# 设置 Ldap 操作的超时

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/newstuff/readtimeout.html](https://docs.oracle.com/javase/tutorial/jndi/newstuff/readtimeout.html)

当客户端向服务器发出 LDAP 请求并且服务器由于某种原因没有响应时，客户端将永远等待服务器响应，直到 TCP 超时。在客户端，用户体验的内容实际上是一个过程挂起。为了及时控制 LDAP 请求，可以从 Java SE 6 开始为 JNDI / LDAP 服务提供程序配置读取超时。

新的环境属性：

`com.sun.jndi.ldap.read.timeout`

可用于指定 LDAP 操作的读取超时。此属性的值是一个整数的字符串表示形式，表示 LDAP 操作的读取超时（以毫秒为单位）。如果 LDAP 提供程序未在指定的时间段内收到 LDAP 响应，则会中止读取尝试。整数应大于零。小于或等于零的整数表示没有指定读取超时，这相当于无限期地等待响应，直到收到默认为原始行为的响应。

如果未指定此属性，则默认为等待响应，直到收到响应。
例如，如果服务器在 5 秒内没有回复，则`env.put("com.sun.jndi.ldap.read.timeout", "5000");`会导致 LDAP 服务提供商中止读取尝试。

下面是一个示例， [`ReadTimeoutTest`](examples/ReadTimeoutTest.java) ，它使用一个虚拟服务器，该服务器不响应 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 响应。