我想通过设置com.sun.jndi.ldap.connect.timeout
属性来控制连接超时。对于小于1000毫秒的值,它工作得很好,但如果我设置的值大于1000,超时不会增加(它保持在1000)。
下面是我试图测试它的代码(服务器关闭):
long start = System.currentTimeMillis();
try
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:10389");
env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system");
env.put(Context.SECURITY_CREDENTIALS, "secret");
env.put("com.sun.jndi.ldap.connect.timeout", "10000");
InitialLdapContext context = new InitialLdapContext(env, null);
} catch (NamingException e)
{
System.out.println("Failed because " + e.getRootCause()
.getMessage() + ". Timeout: " + ((System.currentTimeMillis() - start)) + " ms.");
}
是什么原因导致的?
如果目标主机使用错误代码响应连接请求,则一旦接收到错误代码,连接就会失败。似乎目标主机已启动,目标LDAP服务没有在端口10389侦听。因此,目标主机使用RST响应传入的连接请求,因此立即在客户端抛出异常。这是预期的行为。您肯定不希望延迟接收错误吧?连接超时用于目标主机暂时不可达或目标服务确实忙的情况。
这是一篇关于这个话题的文章。看来这个性质并不是这样的。