KIL O B
2.2. Giới thiệu dịch vụ JNDI (Java Naming and Directory Interface)
JNDI là dịch vụ đăng ký và truy tìm tên đối tượng chuẩn. Enterprise
JavaBeans dựa vào JNDI để truy tìm các thành phần phân tán thơng qua mạng. JNDI là một cơng nghệ chính yếu được yêu cầu cho mã khách kết nối đến một thành phần EJB.
Cách lấy một tham chiếu tới một home object thơng qua dịch vụ JNDI được trình bày ở hình 2.6 như sau:
KILOB OB OO KS .CO M Hệ thống JNDI
Là một service trong hệ thống J2EE phục vụ cho việc đặt tên của các Object, trong đĩ 1 object ta cĩ thể xem như là module, một service để thực hiện một chức năng nào đĩ. Với 1 object cĩ thể cĩ nhiều tên được tham khảo đến. Thơng qua JNDI, client hoặc EJB cĩ thể truy xuất đến object thơng qua tên mà khơng cần quan tâm object đĩ nằm ởđâu trên mạng (khái niệm tương tự như việc đánh tên cho địa chỉ IP).
Hình 2.7: sơđồ client truy xuất đốI tượng thơng qua tên
Một hệ thống JNDI bao gồm 3 phần chính yếu sau: lookup services, service providers, và clients.
Trong đĩ lookup services đĩng vai trị trung tâm, nĩ là cầu nối giữa service providers và clients. Lookup services cĩ nhiệm vụ quản lý các dịch vụ mà service providers cung cấp, service providers cung cấp các dịch vụ cho hệ thống JNDI, cịn clients là người sử dụng các dịch vụ, sẽ kết hợp các dịch vụ với nhau để thực hiện một cơng việc nào đĩ.
Khi một service provider “muốn” đưa ra một dịch vụ nào đĩ thì nĩ phải đăng ký dịch vụđĩ với lookup services. Khi một client muốn dùng một dịch vụ nào đĩ của hệ thống thì nĩ sẽ phải “đề xuất yêu cầu” với lookup service, và các dịch vụ của hệ thống cĩ thể phục vụ cho client khi được lookup service cho phép.
Quá trình đăng ký một dịch vụ của service provider với lookup service được thực hiện như sau (quá trình discovery): đầu tiên service proveider cần thơng báo cho lookup service biết ý định của mình bằng cách gửi broadcast một presence announcement packet (dùng một well-known port). Khi loopkup service nhận được một presence announcement packet (một packet cĩ tính chất thơng báo), nĩ sẽ mở ra và phân tích packet này và lấy các thơng tin về service provider và service mà service provider muốn cung cấp. Nếu lookup services chấp nhận service này thì nĩ sẽ mở cầu nối TCP đến IP và port do presence announcement packet cung cấp để gửi đến đĩ một Object, object này được gọi là service registrar. Mục đích của service registrar object là để tạo sự dễ dàng trong việc giao tiếp giữa service providers và lookup services trong quá trình đăng ký service.
Khi lookup service chấp nhận một service mới bằng cách gửi lại cho service providers một service registrar object, thì quá trình đưa một service vào lookup service được thực hiện như sau (quá trình join): service providers sẽ gọi hàm registrer() của service registrar object với thơng số là một object, object này gọi là service item, nĩ chứa tất cả các thơng tin cần thiết cho một dịch vụ cần đưa vào hệ thống JNDI. Khi quá trình đưa Service Item vào lookup service kết thúc thành cơng thì ta cĩ thể coi như quá trình đưa một service mới vào hệ thống JNDI thành
KILOB OB OO KS .CO M
Service Item cĩ bản chất là một container và nĩ chứa một số các Object khác, trong đĩ chính yếu nhất là một object được đặt tên là service object. Đây là object mà thơng qua đĩ, client cĩ thể tương tác với service. Ngồi ra, service item cịn chứa một số các Object thuộc tính khác như icon, GUIs… của service.
Trong service registrar object cũng cịn cĩ một method cĩ tên là lookup() dành cho client để yêu cầu lookup service kiểm tra tính tồn tại của 1 hoặc 1 số service trong hệ thống JNDI. Và method này trả về service object cho client. Khi client gọi một method trong service object thì service object đĩ sẽ kết nối trực tiếp với service provider tương ứng để thực thi method (thơng qua RMI)
Trong J2EE, JNDI được sử dụng bởi client để nhận ConnectionFactory object. Cĩ 2 loại kỹ thuật cĩ thể dùng được cho JNDI lookup của ConnectionFactory Object:
Dựa trên cơ sở của kỹ thuật Serialication: sử dụng java.io.Serializable. Application server/component tạo ra một instance ManagedConnectionFactory. Instance này được cấu hình bằng cách sử dụng các thơng tin được lưu trong 1 file cấu hình theo cú pháp của XML (các thơng tin về server name, port, gateway…). Bước kế tiếp là server/component tạo ra và thiết lập cấu hình cho một instance của ConnectionManager và truyền instance này đến method
createConnectionFactory của ManagedConnectionFactory object. Khi server/component thực hiện JNDI loookup thì nĩ sẽ trả về 1 ConnectionFactory
object để sử dụng cho Connection này.
Dựa trên cơ sở của kỹ thuật Referenceable: sử dụng
javax.naming.spi.ObjectFactory và javax.naming.Referenceable. Application/Component tạo ra một Reference object. Reference này chứa tất cả các thơng tin mà application server/component cần để tạo và cấu hình cho một
ManagedConnectionFactory tương ứng. Reference này cĩ thể chứa cặp
<reference name>/<logical name> được sử dụng để nhận các đặt tính của factory, reference cũng cĩ thể là một chuỗi nhị phân chứa các thơng số dùng để thiết lập cho ManagedConnectionFactory. Method getObjectInstance sẽ được gọi khi component thực hiện thao tác loookup của ConnectionFactory.
Để loookup 1 object from naming service, ta sử dụng Context.lookup() với thơng số là tên của object mà ta muốn nhận