Giới thiệu về RMI (Remote Method Invocation)

Một phần của tài liệu Đồ án công nghệ thông tin phát triển ứng dụng J2EE với UML (Unified Modeling Language) và Rational Rose (Trang 42)

Mục đích là để tạo ra một Java distributed object model. Trong kiến trúc của RMI, có một yếu tố khá quan trọng mà ta cần phải xác định rõ ràng, đó là việc định nghĩa ra các method và việc thực thi các method đó là hoàn toàn khác nhau. RMI cho phép ta định nghĩa 1 method với mã thực thi của nó trên 1 JVM (Java Virtual Machine) và có thể gọi để thực thi method đó trên một JVM khác.

Hình 2.8: gọi thực thi phương thức thông qua RMI

• Stub and Skeleton layer: lớp này có nhiệm vụ giao tiếp trực tiếp với chương trình ứng dụng, tiếp nhận các lời gọi method của server từ client.

• Remote Reference layer: lớp này quản lý các tham khảo được thiết lập từ client đến remote object service trên server. Đây cũng là lớp dùng để thiết lập kết nối từ client đến remote object service trên server.

• Transport layer: thiết lập kết nối TCP/IP giữa các máy với nhau trên mạng để truyền dữ liệu khi lớp Remote Reference yêu cầu.

Kiến trúc 3 lớp của RMI được thể hiện như hình vẽ sau:

Hình 2.9: sơ đồ kiến trúc ba lớp của RMI

Làm thế nào một client có thể tìm ra một RMI remote service?

Client tìm remote service thông qua việc sử dụng naming or directory service, (1 naming or derectory service được chạy trên một well-known host và port). Trên máy host, 1 chương trình server tạo ra một remote service bằng cách: đầu tiên nó tạo ra một local object để thực thi service đó, sau đó nó export object đó đến RMI. Khi một object được export, RMI tạo ra một listening service để chờ client kết nối đến. Sau quá trình export, server đăng ký object đó trong RMI với một public name và public name này có thể được client sử dụng để kết nối với object tương ứng.

RMI (Java Remote Method Invocation) system là một cơ cấu cho phép 1 object trên 1 JVM (Java Virtual Machine) gọi method của 1 object trên 1 JVM khác. Bất kỳ các object có method có thể được gọi “từ xa” đều phải thực

thi (implement) interface java.rmi.Remote. Khi 1 object được gọi, các giá trị truyền cho method được gửi từ JVM cục bộ (JVM có chứa chương trình phát sinh lời gọi remote method) đến JVM chứa object có method đó và kết quả trả về được gửi về lại cho JVM cục bộ.

Để tạo nên 1 remote object, chương trình phải đăng ký object đó với RMI

registry. Chương trình phải cung cấp 1 cái tên cho object đó khi đăng ký. Khi

một chương trình nào đó muốn truy xuất đến 1 remote object, nó phải cung cấp cho RMI system tên của object mà nó muốn truy xuất và hệ thống sẽ trả về cho chương trình 1 reference đến remote object đó (gọi là stub). Khi

chương trình nhận được stub của 1 remote object thì nó có thể gọi các method của remote object đó có trong stub.

Chuỗi tên của 1 object được RMI register chấp nhận phải có cú pháp như sau “rmi:hostname:port/remoteObjectName” trong đó hostname và port chỉ định máy và port mà trên đó RMI registry đang chạy, và remoteObjectName

là tên của remote object được đăng ký. Chú ý rằng, hostname, port và tiếp đầu ngữ rmi là tuỳ chọn. Nếu hostname không được đặt tả thì giá trị default là

localhost, giá trị default của port1099.

RMI được hỗ trợ bởi việc sử dụng Java Remote Method Protocol (JRMP) và Internet Inter-ORB Protocol (IIOP). JRMP là đặt tả giao thức được thiết kế cho RMI, còn IIOP là giao thức chuẩn cho việc giao tiếp giữa các CORBA object. RMI trên IIOP cho phép các Java remote object không chỉ giao tiếp với các CORBA object viết bằng Java mà còn bằng bất kỳ ngôn ngữ khác.

2.5.Tổng quan về Enterprise JavaBean(là thành phần chính trong đặc tả J2EE)

Enterprise JavaBean là mô hình lập trình ứng dụng đa tầng. Cấu trúc

EJB là cấu trúc Component để phát triển và triển khai các ứng dụng nghiệp vụ phân tán. Các ứng dụng được viết với cấu trúc EJB có thể bảo mật đa người dùng, chia mức và thực hiện giao tác. Những ứng dụng này có thể được viết

một lần sau đó được triển khai trên bất kỳ nền server nào mà hỗ trợ đặc tả EJB.

Môi trường mà các đối tượng Bean sẽ hoạt động gọi là trình chứa (Container). Các trình chứa sẽ kiểm soát việc khởi tạo, cung cấp tài nguyên cho đối tượng, lưu trữ phục hồi đối tượng.

EJB server cung cấp các dịch vụ hệ thống và quản lý Container(hình

2.10). EJB server có khả năng cung cấp các dịch vụ giao tác và dịch vụ đăng ký và truy tìm tên đối tượng (JNDI-Java Naming and Directory Interface).

EJB object bao bọc các thể hiện bean. Nó được sinh ra bởi các tiện ích của

nhà cung cấp EJB Container. EJB object cài đặt remote interface của bean.

Hình 2.10 Quan hệ giữa EJB server và EJB container

EJB home gần giống với EJB object, nó được tự động sinh ra khi cài đặt

enterprise bean trong Container. Nó cài đặt các phương thức được định nghĩa bởi home interface và chịu trách nhiệm hỗ trợ container quản lý vòng đời bean. Kết hợp với EJB container, EJB home chịu trách nhiệm tạo, đặt, và loại (adsbygoogle = window.adsbygoogle || []).push({});

bỏ enterprise bean. Khi phương thức tạo được gọi trên home interface thì EJB home tạo một thể hiện của EJB object mà tham chiếu tới thể hiện bean có kiểu tương ứng. Khi thể hiện bean được kết hợp với EJB object thì phương thức ejbCreate() tương ứng của thể hiện đó sẽ được gọi. Khi hoàn thành phương thức ejbCeate(), EJB home trả lại tham chiếu remote tới client cho EJB object. Sau đó client có thể làm việc trực tiếp với EJB object bằng các phương thức nghiệp vụ.

Để cài đặt Enterprise JavaBean, chúng ta cần hai định nghĩa interface và một hoặc hai lớp: Home interface: định nghĩa phương thức vòng đời của bean: tạo một thể hiện bean mới, loại bỏ bean, và tìm kiếm bean.

Remote interface: để định nghĩa các phương thức nghiệp vụ, (mở rộng

javax.ejb. EJBObject-đối tượng này lại là mở rộng của java.rmi.Remote).

Bean class: cài đặt các phương thức nghiệp vụ của bean, không cài đặt các phương thức của home interface và remote interface.

Primary key: là một lớp cực kỳ đơn giản, cung cấp con trỏ tới cơ sở dữ liệu. Chỉ bean thực thể(entity bean) mới cần primary key.

Hoạt động: client không bao giờ tương tác trực tiếp với lớp bean mà nó luôn luôn sử dụng các phương thức giao tiếp home interface và remote interface của bean để thực hiện công việc của nó. Client sử dụng dịch vụ JNDI tham chiếu tới lớp chủ. Lớp chủ sẽ triệu gọi phương thức tạo ra tham chiếu đến lớp giao tiếp của bean rồi trả về trình khách. Trình khách triệu gọi bean thông qua lớp giao tiếp trung gian mà do lớp chủ trả về. Lớp trung gian này là giao tiếp giữa trình chứa Container và đối tượng bean thực sự.

Như ta đã giới thiệu ở trên, enterprise bean là một thành phần phần mềm ở phía Server mà có thể triển khai trong một môi trường phân tán. Một

enterprise bean có thể gồm một hay nhiều các đối tượng java tại vì một thành phần có thể là nhiều hơn một đối tượng đơn giản.

Session Beans:(Bean thao tác) chỉ có nhiệm vụ phục vụ trình khách trong một phiên kết nối. Bean thao tác chỉ thực hiện các hành vi xử lý, tính toán đơn thuần không đòi hỏi đến việc thể hiện dữ liệu. Các Session bean có thể dùng bởi một máy khách tại một thời điểm, chúng không chia xẻ cho các máy khách khác. Khi máy khách đang dùng một session bean máy khách đó là máy khách duy nhất giải quyết session bean đó. Điều này trái ngược với entity bean, trạng thái của nó được chia xẻ giữa các máy khách với nhau. Trong session bean được chia làm hai loại: Stateful Session Bean và Stateless Session Bean:

Stateful Session Bean: là các thành phần bean cần lưu lại kết quả hay vị trí giao dịch trước đó để phục vụ cho các lần giao dịch tiếp theo - thường phục vụ cho những thao tác đòi hỏi qua nhiều bước triệu gọi trước khi trả về kết quả cuối cùng.

Stateless Session Bean: là các thành phần bean không lưu lại trạng thái của giao dịch trước đó để sử dụng lại cho lần giao dịch sau.

Session beans quản lý các xử lý nghiệp vụ. Các session bean có thể sử dụng entity beans để thể hiện dữ liệu mà chúng dùng. Một điểm khác biệt giữa Session Bean và Entity Bean là: Entity Bean có vòng đời lâu hơn Session Bean nhiều. Khi ứng dụng Server bị sự cố thì Entity Bean có thể được xây dựng lại trong bộ nhớ bằng cách đơn giản là đọc lại dữ liệu từ cơ sở dữ liệu bền vững.

Entity Bean:

Một phần cơ bản khác của một nghiệp vụ là bền vững dữ liệu mà xử lý nghiệp vụ sử dụng. Entity Bean chính là một thành phần mà đại diện cho bền vững dữ liệu. Entity Bean không chứa xử lý nghiệp vụ logic.

Bean thực thể tự quản lý(Bean – Managed Persistent Entity Beans): là các thành phần bean có khả năng tự truy vấn các hệ cơ sở dữ liệu để lấy về dữ liệu nó thể hiện. BMP (Bean Managed Persistent) có những ưu điểm: mình có thể viết mã cho các phương thức, nhất là các phương thức thao tác với nhiều bảng dữ liệu cùng một lúc. Đồng thời sẽ tiện hơn khi tạo mới dữ liệu, vì ta có thể sử dụng định dạng sequence – tăng tự động chỉ số id trong bảng dữ liệu. Nhưng có một nhựơc điểm là sẽ tốn thời gian để viết, mà chính ta viết thì có thể bị lỗi.

Bean thực thể quản lý bởi trình chứa: (Container –Managed Persistent

Entity Beans)

Là các thành phần bean không cần sử dụng lệnh SQL để tìm kiếm hay tạo mới dữ liệu mà chỉ cần khai báo các tên trường hay cột dữ liệu tương ứng với các bảng trong hệ CSDL. Trình chứa sẽ tự động thực hiện công việc truy vấn dữ liệu giúp thành phần bean. CMP(Container – Managed Persistent) lại có một ưu điểm rất lớn là chúng ta không phải viết mã, trình chứa đã thực hiện điều này. Và như thế chương trình không bao giờ có lỗi. Nhưng nó lại bất lợi ở chỗ: trường primary key có kiểu java.math.BigDecimal nên không tận dụng được định dạng sequence của cơ sở dữ liệu. Hơn nữa, khi chúng ta cần thao tác với nhiều bảng cùng một lúc(có sự join giữa các bảng) thì sẽ phức tạp hơn- cần viết thêm lớp bean kết nối hai thực thể bean của hai bảng dữ liệu kia.

Message – driven bean: xử lý các thông điệp ( message một cách không

đồng bộ. Nó tương tự như stateless session bean ở chỗ nó không lưu trữ trạng thái giao dịch. Điểm khác với Session và Entity Bean là client không thể truy cập chúng qua interface. Message – driven bean chỉ là một lớp bean, không có interface. Chỉ cần một bean này nó vẫn có thể xử lý nhiều message từ nhiều hoặc một client. Bean này là một khối mã ứng dụng mà có thể thực hiện khi message đến.

2.6. Phát triển các thành phần: (Developing Beans)

Đặc tả EJB định nghĩa vài giao tiếp chuẩn mà lớp bean có thể thực hiện. Sức mạnh giao tiếp của lớp bean là trình bày các phương thức đảm bảo mà tất cả các beans phải cung cấp, như đã định nghĩa bởi mô hình thành phần EJB. Trình chứa gọi những phương thức đã yêu cầu để quản lý các bean và thay đổi bean đến các sự kiện quan trọng.

Hầu hết các giao tiếp cơ bản của các lớp bean (cả session và entity bean) phải thực hiện là:

public interface javax.ejb.EnterpriseBean extends java.io.Serializable {

}

Source 3.1 javax.ejb.EnterpriseBean interface

The EJB object:

Khi một máy khách muốn dùng một thể hiện của một lớp enterprise bean, máy khách đó không bao giờ triệu gọi phương thức đó một cách trực tiếp. Nói đúng hơn là sự viện cầu bị ngăn chặn bởi trình chứa EJB và rồi chuyển giao cho thể hiện của bean. Trình chứa EJB đang hoạt động như một tầng gián tiếp giữa mã khách và bean. Tầng gián tiếp này biểu hiện như một đối tượng đơn nhận biết mạng, được gọi là EJB object. EJB object là một đối tượng đại diện mà nhận biết về mạng, giao tác, an ninh …Nó là một đối tượng thông minh biết làm thế nào để thực hiện logic trung gian các yêu cầu tới trình chứa EJB trước khi một lời gọi phương thức được phục vụ bởi một thể hiện của lớp bean. Một EJB object hoạt động hàn gắn giữa máy khách và thành phần bean, và nó trình bày mỗi phương thức nghiệp vụ mà chính bean đó biểu hiện. EJB object chuyển giao tất cả các yêu cầu máy khách đến bean. EJB object là một thành phần vật lý của trình chứa (container).

The Remote Interface: (adsbygoogle = window.adsbygoogle || []).push({});

Để định nghĩa các phương thức nghiệp vụ. Các thành phần máy khách triệu gọi phương thức trên EJB object, đúng hơn là chính các bean đó. Để

thực hiện điều này, EJB object phải định nghĩa từng phương thức nghiệp vụ mà các lớp bean biểu hiện. Nhưng làm thế nào các công cụ tự động tạo ra EJB object biết phương thức nào để định nghĩa? Câu trả lời là một giao tiếp đặc biệt mà nhà cung cấp bean viết. Giao tiếp này sao lại tất cả các phương thức nghiệp vụ mà lớp bean tương ứng biểu hiện. Giao tiếp này được gọi là remote interface.

Remote interface phải phù hợp với các luật mà đặc tả EJB định nghĩa. Xem mã nguồn 3.2(Source 3.2)

Hình 2.11: sơ đồ gọi phương thức từ Client đến EJB objects

public interface javax.ejb.EJBObject extends java.rmi.Remote {

public abstract java.ejb.EJBHome getEJBHome() throws java.rmi.RemoteException;

public abstract java.lang.object getPrimaryKey() throws java.rmi.RemoteException;

public abstract void remove() throws

public abstract java.ejb.Handle getHandle() throws java.rmi.RemoteException;

public abstract boolean isIdentical(javax.ejb.EJBObject) throws java.rmi.RemoteException;

}

Source 3.2 the javax.ejb.EJBObject interface

Mã khách muốn làm việc với các bean gọi các phương thức trong javax.ejb.EJBObject. Mã khách có thể là ứng dụng stand-alone, applets, servlet thậm chí cả các bean khác. Thêm vào đó, remote interface sao lại các phương thức nghiệp vụ của bean. Khi một trình khách của bean triệu gọi bất kỳ phương thức nghiệp vụ nào, EJB object sẽ chuyển giao phương thức đó tới sự thực hiện tương ứng, sự thực hiện này cư trú bên trong các bean đó.

The Home Object:

Như chúng ta đã biết, mã client xử lý với EJB object và không bao giờ làm việc trực tiếp với bean. Câu hỏi là làm thế nào trình khách đạt được tham chiếu tới EJB object. Máy khách không thể thuyết minh EJB object một cách trực tiếp tại vì EJB object có thể tồn tại trên một máy khác chứ không cùng trên máy client. Dường như sự định vị EJB object là trong suốt, vì vậy máy khách sẽ không bao giờ nhận ra chính xác EJB object cư trú nơi nào.

Để đạt được tham chiếu tới một EJB object, mã client yêu cầu một EJB object từ một xí nghiệp EJB object (EJB object factory). Xí nghiệp này chịu trách nhiệm cho sự thuyết minh EJB object. Đặc tả EJB gọi xí nghiệp này là một home object. Trách nhiệm của home object là làm các việc sau:

+ Tạo EJB objects

+ Tìm các EJB object đang tồn tại + Hủy bỏ các EJB object.

Home object là một phần vật lý của trình chứa và được tự động tạo ra bởi công cụ của nhà cung cấp trình chứa(container provider).

The Home Interface:

Chúng ta đã thấy home object là các xí nghiệp cho EJB object. Nhưng bạn phải cung cấp thông tin cho trình chứa bằng đặc tả một home interface. Home interface định nghĩa các phương thức đơn giản cho việc tạo, huỷ, tìm kiếm EJB object. Home object của trình chứa thực hiện home interface cho chúng ta.

Vài phương thức mà đặc tả EJB yêu cầu các home interface phải hỗ trợ. Những phương thức đã yêu cầu này được định nghĩa trong javax.ejb.

EJBHome interface- một home interface mà home interface của chúng ta phải thừa kế.

Javax.ejb. EJBHome được trình bày như sau:

Public interface javax.ejb.EJBHome extendx java.rmi.Remote {

public abstract EJBMetaData getEJBMeTaData() throws java.rmi.RemoteException;

public abstract void remove(Handle handle) throws java.rmi.RemoteException, javax.ejb.RemoveException;

public abstract void remove(Object primaryKey) throws java.rmi.RemoteException, javax.ejb.RemoveException;

}

Hình 2.12:sơ đồ yêu cầu tạo một EJB object từ Home objects (adsbygoogle = window.adsbygoogle || []).push({});

Giải thích quá trình làm việc của hình 2.11 và 2.12:

Khi phương thức tạo được gọi trên home interface từ trình khách thì EJB home tạo một thể hiện của EJB object mà tham chiếu tới thể hiện bean có kiểu tương ứng. Khi thể hiện bean được kết hợp với EJB object thì phương

Một phần của tài liệu Đồ án công nghệ thông tin phát triển ứng dụng J2EE với UML (Unified Modeling Language) và Rational Rose (Trang 42)