7 votes

Spring LDAP : Réinitialisation de la connexion par le pair

J'utilise la classe Spring LdapTemplate pour accéder à ldap. J'utilise un pool de connexions ldap (classe PoolingContextSource) pour éviter de créer des connexions tout le temps à l'exécution. Cependant, j'obtiens parfois cette exception dans mon application :

javax.servlet.ServletException: org.springframework.ldap.CommunicationException: Connection reset; 
nested exception is javax.naming.CommunicationException: Connection reset [Root exception is java.net.SocketException: Connection reset]; 
Remaining name: 'ou=memberlist,ou=mygroups,o=mycompany.com'

(...)

Mes classes ldap sont définies dans le xml suivant

<bean id="contextSource" class="com.ibm.tp4.spring.ldap.CustomPoolingContextSource">
  <property name="contextSource" ref="contextSourceTarget" />
  <property name="testWhileIdle" value="true" />
  <property name="minEvictableIdleTimeMillis" value="300000" />
  <property name="timeBetweenEvictionRunsMillis" value="10000"/>
  <property name="dirContextValidator">
    <bean class="org.springframework.ldap.pool.validation.DefaultDirContextValidator" />
  </property>
</bean>

<bean id="contextSourceTarget" class="org.springframework.ldap.core.support.LdapContextSource">
  <property name="url" value="${ldap.url}" />
  <property name="pooled" value="false" />
  <property name="anonymousReadOnly" value="true" />
</bean>

<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
  <constructor-arg ref="contextSource" />
</bean>

<bean id="myLdapResolver" class="com.ibm.tp4.model.service.user.MyLdapResolver">
  <constructor-arg ref="ldapTemplate" />
  <property name="ldapUserSearchBase" value="${ldap.user.search_base}" />
  <property name="ldapUserEmailAddressField" value="${ldap.user.email_address}" />
  <property name="ldapAttributes" value="${ldap.user.attributes}" />
</bean>

Quelqu'un a-t-il rencontré ce problème et peut-il suggérer une solution ?

J'ai pensé à utiliser le paramètre testOnReturn dans les propriétés du pool au lieu de l'évictor de connexion utilisé actuellement. Lorsque je le fais, j'obtiens l'avertissement suivant lorsque je lance mon application web dans le navigateur :

WARN [org.springframework.ldap.pool.validation.DefaultDirContextValidator] - 
DirContext 'javax.naming.ldap.InitialLdapContext@d150d15' failed validation with an 
exception.javax.naming.OperationNotSupportedException: [LDAP: error code 53 - Unwilling To Perform]; 
Remaining name: ''

et peu après, je reçois cette exception :

org.springframework.dao.DataAccessResourceFailureException: Failed to borrow DirContext from pool.; nested exception is java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed  
org.springframework.ldap.pool.factory.PoolingContextSource.getContext(PoolingContextSource.java:425)

Merci d'avance.

2voto

Oliver Stutz Points 583

On dirait que la définition du temps mort est trop basse. Il y a un site officiel d'Oracle qui vous donnera la possibilité de trouver la source du problème, très probablement ce n'est pas "Spring" mais le connecteur Sun Ldap ou votre serveur Ldap. Beaucoup de gens sont contre le fait de fournir des liens mais je ne peux tout simplement pas copier cette page, peut-être que vous pouvez essayer la déclaration "raw" sur leur site pour voir si cela se produit aussi. Cela vous rapprochera un peu plus de votre solution. (probablement la configuration du timeout de ldap)

http://docs.oracle.com/javase/tutorial/jndi/newstuff/readtimeout.html

env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.ldap.LdapCtxFactory");
env.put("com.sun.jndi.ldap.read.timeout", "1000");
env.put(Context.PROVIDER_URL, "ldap://localhost:2001");

Server s = new Server();

try {

    // start the server
    s.start();

   // Create initial context
   DirContext ctx = new InitialDirContext(env);
   System.out.println("LDAP Client: Connected to the Server");
        :
        :
} catch (NamingException e) {
   e.printStackTrace();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X