CommunicationException [Корневым исключением является ConnectException: истекло время ожидания соединения]

Иногда я получаю это исключение при попытке подключиться к 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 ответа

Это иногда случается и со мной. И поскольку это происходит только в ~1% случаев, я сомневаюсь, что это одна из причин, перечисленных в ответе Джунеда, поскольку в моих настройках ничего не меняется.

Для меня это происходит совершенно случайно и фиксируется без каких-либо конкретных действий с моей стороны. Это заставляет меня поверить, что приведенный здесь ответ является правильным:

Скорее всего, это утечка соединения. Время ожидания соединения может быть вызвано многими причинами, но большинство из них будет вызывать его каждый раз. Весьма вероятно, что сервер LDAP имеет максимальное количество подключений, которые он будет обрабатывать одновременно, и, кроме того, он не будет вызывать accept(), поэтому новые входящие подключения остаются в очереди невыполненных работ, которая заполняется, что может привести к тому, что время от времени будут поступать другие входящие подключения. из.

@OP Можете ли вы запустить netstat -anp на сервере, когда это произойдет, чтобы проверить приведенную выше гипотезу? Вы также можете установить тайм-аут простоя соединения на сервере LDAP? Это исправило бы утечки соединения, но грубым способом, который может сломать другие вещи.

Я также начал это замечать, когда поменял использование Timer с ScheduleExecutorService для запуска моего Ldap Server. Проблема оказалась в состоянии гонки. Я изменил время запуска моего 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);

Я получаю ту же ошибку после перехода на LDAPS. Сейчас я использую порт 636 и обнаружил, что один из контроллеров домена в домене, к которому я подключаюсь, заблокирован на порту 636.

[Исключением корня является java.net.ConnectException: истекло время ожидания соединения: соединение] I

Возникла такая же периодическая проблема, хотя конфиг указывал на доменное имя (не IP).

Используя NSLOOKUP, было обнаружено, что в списке был указан несуществующий DC, что вызывало периодические проблемы с подключением.

Другие вопросы по тегам