2012-01-09 16 views
8

Ben bir Java programı aracılığıyla, bir javax.naming.ldap.LdapContext oluşturmak ve üzerinde bir search() işlemi yapmak bir durum var. Daha sonra, uyumak için Java uygulama iş parçacığı koydum, bu sırada LDAP sunucusunu yeniden başlatın (OpenLDAP, sadece not etmek için). App iş parçacığı uyanır ve daha önce oluşturulan LdapContext herhangi bir işlem yapmaya çalıştığında, "CommunicationException: Connection is closed" atar. Benim istediğimLDAP sunucusu yeniden başlatıldığında nasıl yeniden bağlanır? altta yatan bir bağlantı yapar -

bağlantıyı yeniden kurmak mümkün olmaktır.

LdapContext'un reconnect() yöntemine sahip olduğunu görüyorum; burada denetimleri null olarak geçiriyorum. Ancak, bunun hiçbir etkisi yoktur. Sun LDAP uygulamasında, LDAP sunucusunun yeniden başlatıldığı sırada gördüğüm, Sun uygulamasının sürdürdüğü ConnectionPool, com.sun.jndi.ldap.LdapClient örneğini "kullanabilmeniz = false" olarak işaretledi. reconnect() çağrı üzerine - sadece usable bayrak false olup olmadığını tekrar kontrol eder ki, ensureOpen() çağırır - bu false ise; daha sonra CommunicationException atar - böylelikle bire dönüş.

Sorum şu: bir Java uygulaması harici LDAP sunucusu yeniden kurtulursa nasıl? Yeni LdapContext'un yeniden oluşturulması tek çıkış yolu mu? Herhangi bir anlayış için teşekkür ederiz. Bu otomatik yeniden işlem istemciye görünmez olup, burada otomatik-bağlantıya

javax.naming.CommunicationException: connection closed [Root exception is java.io.IOException: connection closed]; remaining name 'uid=foo,ou=People,dc=example,dc=com' 
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1979) 
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1824) 
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1749) 
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:368) 
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:338) 
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:321) 
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:248) 
Caused by: java.io.IOException: connection closed 
at com.sun.jndi.ldap.LdapClient.ensureOpen(LdapClient.java:1558) 
at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:504) 
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1962) 
... 26 more 
+0

Herhangi bir Bind kullanıcısını değiştirmediyseniz, sunucuyu yeniden başlattıktan sonra sorunun gelmesi gerektiğini düşünmüyorum. –

+0

Merhaba İmza, ne yazık ki - LDAP sunucusu yeniden başlatıldıktan sonra LdapContext'deki tüm işlemler CommunicationException ile başarısız. – Anand

+0

Bazı kodları paylaşır mısınız, nasıl bağlantı oluşturuyorsunuz ve aramak için kullanıyor musunuz? –

cevap

-1

Bu LDAP bağlantısı havuzlamasıyla esasen ilgili olduğunu hatırlatmak gerekir. here tanımlanan gibi:

bir bağlantı, kullanılan havuzdan alınan havuza döndü ve daha sonra başka bir bağlam örneğin havuzdan tekrar alınır.

Böylece, önceki bağlantının yeniden böyle soruna neden olabilir:

Sen de

com.sun.jndi.ldap.connect.pool=false 
ayarlayarak LDAP bağlantı havuzu kullanmadan davranışını test edebilir, başka bir olası nedeni olabilir LDAP işlemlerini okuma zaman aşımı. Aslında, belirli bir zaman aşımı sonrasında LDAP sunucusunun kapatılması hakkında okuma işlemi bildirilmez. Daha fazla bilgi için, biz iş yerinde bu sorun vardı this link

+0

Bağlantı havuzu varsayılan olarak kapalıdır. Son paragrafından çok anlam çıkaramıyorum. Bir okuma sırasında sunucu aşağı inerse kesinlikle haberdar edilecektir. – EJP

0

bir göz sürebilir. Geldiğimiz çözüm (en iyi cevap olmayabilir). Bağlantıyı belirli bir oranda kontrol edecek bir watchdog ipliği oluşturmak oldu. Bağlantı çalışmadıysa, LDAP ile bağlantı yeniden başlatılır.

2

JNDI bağlantı havuzunu etkinleştirin ve bunların hepsi sizin için arkanızda olacak. Özellikler için JNDI Kılavuzuna ve LDAP Sağlayıcısı belgelerine bakın. Sadece birkaç özellik tarafından kontrol ediliyor.

İlgili konular