【问题标题】:java jndi ldap connection timeoutjava jndi ldap 连接超时
【发布时间】:2011-09-22 09:54:28
【问题描述】:

我想通过设置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.");
}

这可能是什么原因?

【问题讨论】:

  • 似乎与我将 PROVIDER_URL 设置为 localhost 的事实有关。我在 java.net 类中进行了一些调试,发现超时已正确传递给本机方法。将提供程序更改为 localhost 以外的其他内容会使其等待指定的时间。

标签: java ldap timeout jndi


【解决方案1】:

如果目标主机以错误代码响应连接请求,则一旦收到错误代码,连接就会失败。目标主机似乎已启动,并且目标 LDAP 服务未在端口 10389 上侦听。因此目标主机使用 RST 响应传入的连接请求,因此客户端立即引发异常。这是预期的行为。您肯定不想延迟收到错误吗?连接超时适用于目标主机暂时无法访问或目标服务真的很忙的情况。

【讨论】:

    【解决方案2】:

    This is a post 关于这个话题。似乎这个属性并没有真正以这种方式工作。也许this follow-up thread 可以帮上忙。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多