2012-01-09 51 views
8

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

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

+0

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

+0

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

Trả lời

0

Các UnboundID LDAP SDK cung cấp một phương tiện để tự động kết nối trong đó có hoạt động tự động kết nối lại là vô hình cho khách hàng.

-1

Bạn nên lưu ý rằng điều này chủ yếu liên quan đến kết nối kết nối LDAP. Như được định nghĩa here:

Kết nối được lấy từ hồ bơi, được sử dụng, quay lại hồ bơi và sau đó được lấy lại từ hồ bơi cho một trường hợp Ngữ cảnh khác.

Do đó, việc tái sử dụng một kết nối trước đó có thể gây ra vấn đề như vậy:

Bạn có thể kiểm tra hành vi mà không cần sử dụng LDAP kết nối tổng hợp bằng cách thiết lập

com.sun.jndi.ldap.connect.pool=false 

Ngoài ra, một nguyên nhân khác có thể có thể là hết thời gian đọc các hoạt động LDAP. Thực tế, thao tác đọc không được thông báo về việc đóng máy chủ LDAP sau một thời gian chờ cụ thể. Để biết thêm thông tin, bạn có thể xem this link

+0

Kết nối tổng hợp được tắt theo mặc định. Tôi không thể hiểu được nhiều về đoạn cuối của bạn. Nếu máy chủ bị hỏng trong khi đọc, bạn chắc chắn sẽ được thông báo. – EJP

0

Chúng tôi đã gặp sự cố này tại nơi làm việc. Giải pháp mà chúng tôi đưa ra (có thể không phải là câu trả lời hay nhất). Đã được tạo ra một thread watchdog sẽ kiểm tra kết nối ở một số tỷ lệ cố định. Nếu kết nối không hoạt động, nó sẽ khởi tạo lại kết nối với LDAP.

2

Chỉ cần bật ghép nối kết nối JNDI và tất cả sẽ được xử lý cho bạn sau hậu trường. Xem Hướng dẫn về tính năng JNDI và tài liệu về nhà cung cấp LDAP. Nó được kiểm soát bởi chỉ một vài đặc tính.

Các vấn đề liên quan