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:
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 công.
Service Item có bản chất là một container và nó chứa một số các Object khác, trong đó
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 ConnectionFactoryobject để
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 ManagedConnectionFactorytươ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