2012-09-17 131 views
4

我正在使用Spring LdapTemplate類訪問ldap。我正在使用一個ldap連接池(PoolingContextSource類)來避免在運行時一直創建連接。不過,我有時會得到這個例外在我的應用程序:春天LDAP:連接重置由對端

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' 

(...)

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

有沒有人遇到過這個問題,可以建議解決方案?

我想過在池屬性中使用testOnReturn參數,而不是現在使用的連接排除器。當我這樣做,我得到以下警告當我運行在瀏覽器中我的web應用程序:

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

不久之後,我得到這個異常:

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) 

在此先感謝。

回答

2

它看起來像超時定義是低的方式。有一個來自Oracle的官方網站,可以幫助您找出問題的根源,很可能它不是Sun的Ldap連接器或Ldap服務器的「Spring」。很多人反對提供鏈接,但我不能複製此頁面,也許你會在他們的網站上嘗試「原始」聲明以查看它是否也發生了。它會讓您更接近您的解決方案。 (可能是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(); 
} 
+0

1)我使用了Spring LDAP,它是圍繞Java(JNDI)LDAP的包裝。我不知道如何使用Spring庫設置這個超時。 2)我添加了一個警告,顯示在我的問題的異常之前,問題似乎是一個無效的操作,而不是超時。 –

+0

你想要執行什麼操作? –

+0

我只是設置了Sprint LDAP屬性,用於測試在使用LDAP連接池時從LDAP連接池獲得的每個LDAP連接是否有效。可能Spring會向LDAP服務器發送一個簡單的虛擬請求來驗證連接,但我不知道該請求執行的是哪個ldap操作。我不得不閱讀框架代碼來弄清楚。 –