Tôi có một tình huống trong đó thông qua một chương trình Java, tôi tạo ra một javax.naming.ldap.LdapContext
và thực hiện thao tác search()
trên đó - kết nối cơ bản. Sau đó, tôi đặt chuỗi ứng dụng Java vào chế độ ngủ, trong đó tôi khởi động lại máy chủ LDAP (OpenLDAP, chỉ cần lưu ý). Khi chuỗi ứng dụng khởi động và cố gắng thực hiện bất kỳ thao tác nào trên LdapContext
được tạo trước đó, nó sẽ ném "CommunicationException: Connection is closed
".Cách kết nối lại khi máy chủ LDAP được khởi động lại?
Điều tôi muốn là có thể thiết lập lại kết nối.
Tôi thấy rằng LdapContext
có phương thức reconnect()
- nơi tôi chuyển điều khiển dưới dạng null
. Tuy nhiên, điều này không có hiệu lực. Những gì tôi thấy trong việc thực hiện LDAP Sun rằng trong thời gian khi máy chủ LDAP được khởi động lại, ConnectionPool được duy trì bởi việc thực hiện Mặt trời đánh dấu trường hợp cơ bản com.sun.jndi.ldap.LdapClient
với "có thể sử dụng = sai". Khi cuộc gọi reconnect()
- nó chỉ cần gọi ensureOpen()
, một lần nữa kiểm tra xem cờ usable
có phải là false
hay không - nếu đó là false
; sau đó nó ném CommunicationException
- để quay lại hình vuông.
Câu hỏi của tôi là: ứng dụng Java tồn tại như thế nào khi khởi động lại máy chủ LDAP bên ngoài? Việc tạo mới LdapContext
một lần nữa có phải là cách duy nhất không? Đánh giá cao mọi thông tin chi tiết.
Đây là stacktrace của ngoại lệ:
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
Tôi không nghĩ rằng vấn đề sẽ đến sau khi khởi động lại máy chủ nếu bạn không thay đổi bất kỳ người dùng Bind nào. –
Hi Imran, thật không may - tất cả các thao tác trên LdapContext đều thất bại với CommunicationException, sau khi máy chủ LDAP đã được khởi động lại. – Anand
Bạn có thể chia sẻ một số mã, cách bạn tạo kết nối và sử dụng nó để tìm kiếm không? –