简体   繁体   English

Spring LDAP:由peer重置连接

[英]Spring LDAP: Connection reset by peer

I'm using Spring LdapTemplate class to access ldap. 我正在使用Spring LdapTemplate类来访问ldap。 I'm using a pool of ldap connections (PoolingContextSource class) to avoid creating connections all the time at runtime. 我正在使用一个ldap连接池(PoolingContextSource类)来避免在运行时始终创建连接。 However, I get this exception sometimes at my 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'

(...) (......)

My ldap classes are defined in the following xml 我的ldap类在以下xml中定义

<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>

Has anyone experienced this problem and can suggest a solution? 有谁遇到过这个问题,可以提出解决方案吗?

I thought about using testOnReturn parameter in the pool properties instead of connection evictor used right now. 我想过在池属性中使用testOnReturn参数而不是现在使用的连接逐出器。 When I do, I get the following warning when I run my web application in the browser: 当我这样做时,在浏览器中运行我的Web应用程序时会收到以下警告:

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: ''

and soon after, I get this 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)

Thanks in advance. 提前致谢。

It looks like the time out definition is way to low. 看起来超时定义是低的。 There is a official Site from Oracle that will give you the possibility to figure out the source of the problem, very likely its not "Spring" its the Sun Ldap connector or your Ldap Server. 有一个来自Oracle的官方站点可以让你找出问题的根源,很可能它不是“Spring”它的Sun Ldap连接器或你的Ldap服务器。 Lots of people are against providing Links but i simply can't copy this page, maybe you try the "raw" statement on their site to see if it occurs too. 很多人反对提供链接,但我根本无法复制此页面,也许你在他们的网站上尝试“原始”声明,看它是否也发生。 It will bring you a step closer to your solution. 它将使您更接近您的解决方案。 (probably the ldap timeout config) (可能是ldap超时配置)

http://docs.oracle.com/javase/tutorial/jndi/newstuff/readtimeout.html 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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM