Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Java LDAP exception: Problem searching directory: javax.naming.CommunicationException

#java #ldap


Работаю с LDAP на Java. При первом запуске программы, все проходит отлично, данные
приходят нормально. Но если пройдет некоторые время, 1-2 часа, то программа начинает
выдавать Exception


  Problem searching directory: javax.naming.CommunicationException: iat.iat:389
  
  [Root exception is java.net.ConnectException: Connection timed out: connect]


И проблема решается, если перезагрузить ПК, на котором запущена программа. Кто знает,
как решить проблему?

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put("java.naming.security.principal", "isdgfh@iat.iat");
env.put("java.naming.security.credentials", "ergdfgdfgdf");
env.put("java.naming.provider.url", "ldap://iat.iat:636/DC=iat,DC=iat");

env.put(Context.PROVIDER_URL, ldapURL);

try {
    LdapContext ctx = new InitialLdapContext(env, null);
    SearchControls searchCtls = new SearchControls();
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    // Фильтр для поиска группы по никнейму
    String searchFilter = "(sAMAccountName=" + username + ")";

    // Где Искать
    String searchBase = "DC=iat,DC=iat";

    //Член
    String returnedAtts[] = {"member"}; 
    //String returnedAtts[] = null;
    searchCtls.setReturningAttributes(returnedAtts);
    System.out.println(username);
    NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
    //Выборка из AD по логину
    while (answer.hasMoreElements()) {
        sr = (SearchResult) answer.next();
        sr2 = sr.toString();
    }
    ctx.close();
} catch (NamingException e) {
    System.err.println("Problem searching directory: " + e);
}
return sr2;

    


Ответы

Ответ 1



Для начала стоит понять не текут ли соединения. Для этого можно сделать heap dump (используя, например, jmap), когда после нескольких часов программа стала выдавать java.net.ConnectException и посмотреть на него в Eclipse MAT, YourKit или чём нибудь ещё. Искать стоит соединения, которые используются внутри LdapContext'а. Также стоит перенести закрытие контекста в finally, т. к. соединения могут течь в случае javax.naming.NamingException.

Комментариев нет:

Отправить комментарий