【问题标题】:CommunicationException [Root exception is ConnectException: Connection timed out]CommunicationException [根异常为 ConnectException: Connection timed out]
【发布时间】:2013-05-01 00:36:16
【问题描述】:

我在尝试连接 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); 中获取连接超时异常。 它不会每次都发生,但经常发生。

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

【问题讨论】:

  • 这是我为克服上述随机问题所做的一种解决方法:捕获 CommunicationException,然后至少再试 3 次。希望它对像@futurebaby 这样的人有用

标签: java ldap runtime-error communicationexception connectexception


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    虽然配置指向域名(不是 IP),但也遇到了同样的间歇性问题。

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

    【讨论】:

      【解决方案3】:

      当我用 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);

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • (这篇文章似乎没有为问题提供quality answer。请编辑您的答案并改进它,或者将其作为对问题的评论发布)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 2021-09-11
        • 2017-08-12
        • 2020-07-19
        相关资源
        最近更新 更多