6

在尝试连接 Active Directory 时,我偶尔会遇到此异常。

javax.naming.CommunicationException: <ServerIP>:<PORT> 
  [Root exception is java.net.ConnectException: Connection timed out: connect]

这是我的代码:

    DirContext ctx = null;
    Properties env = new Properties();

    env.put(Context.SECURITY_PRINCIPAL, <Bind_USER>);
    env.put(Context.SECURITY_CREDENTIALS, <Bind_USER_PWD>);
    env.put(Context.PROVIDER_URL, "ldap://<ServerIP>:<PORT>");            
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

    ctx = new InitialDirContext(env);

在此行中获取连接超时异常ctx = new InitialDirContext(env);。它不会每次都发生,但经常发生。

请告诉我,如何摆脱这个问题?

4

4 回答 4

4

这也偶尔发生在我身上。而且因为它只发生约 1% 的时间,我怀疑这是 Juned 的答案中列出的任何原因,因为我的设置没有任何变化。

对我来说,它是随机发生的,并且在我没有任何具体行动的情况下被修复。这让我相信这里提供的答案是正确的:

这很可能是连接泄漏。连接超时可能是由很多事情引起的,但其中大多数每次都会导致它。很可能 LDAP 服务器有最大数量的连接,它将同时处理,除此之外它不会调用 accept(),因此新的传入连接保留在积压队列中,这会填满,这可能会导致进一步的传入连接超时出去。

@OP 发生这种情况时,您可以在服务器上运行 netstat -anp 以检查上述假设吗?您还可以在 LDAP 服务器上设置连接空闲超时吗?这将修复连接泄漏,但以暴力方式可能会破坏其他东西。

于 2016-08-17T14:38:48.613 回答
0

当我用 ScheduledExecutorService 替换 Timer 来启动我的 Ldap 服务器时,我也开始注意到这一点。这个问题原来是一个竞争条件。我将 Ldap 服务器的启动时间从 0 延迟更改为 5 秒延迟,这似乎已将 java.net.ConnectException 解析为我的 Ldap 服务器。

这里存在竞争条件:

final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); ses.scheduleWithFixedDelay(ldapServer, 0, 5, TimeUnit.SECONDS);

比赛条件在这里解决:

final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); ses.scheduleWithFixedDelay(ldapServer, 5, 5, TimeUnit.SECONDS);

于 2018-07-30T18:28:42.767 回答
0

有同样的间歇性问题,尽管配置指向一个域名(不是 IP)。

通过使用 NSLOOKUP,发现列出了一个不存在的 DC,这导致了间歇性连接问题。

于 2017-10-09T23:54:35.213 回答
0

转移到 LDAPS 后我遇到了同样的错误我现在使用端口 636,我发现我连接到的域上的域控制器之一在端口 636 上被阻止。

[根异常是 java.net.ConnectException: Connection timed out: connect] 我

于 2018-09-12T09:19:38.070 回答