Quy trình mà ta vẫn thực hiện từ trước đến giờ khi cài đăt đối tượng trên máy chủ vẫn là :
- Khởi động bộ đăng ký rmiregistry bằng cách gọi chương trình rmiregistry.exe hay gọi hàm LocateRegistry.CreateRegistry() ;
- Tạo đối tượng trên máy chủ và đăng ký nó với rmiregistry
- Lắng nghe các yêu cầu hay lời triệu gọi phương thức từ phía máy khách
Hãy hình dung trên máy chủ bạn có 10000 đối tượng đều có khả năng phục vụ cho máy khách . Vậy thì để sử dụng được 10000 đối tượng này trước tiên bạn phải xin cấp phát bộ nhớ cho tất cả các đối tượng .Sau đó mỗi đối tượng đều đặt trong trạng thái sẵn sàng chờ máy khách. Điều này sẽ gây hao tốn tài nguyên của máy chủ bởi vì không phải tất cả các đối tượng đều được máy khách yêu cầu sử dụng vào cùng 1 thời điểm.Java cung cấp cơ chế tự động kích hoạt (activation) đối tượng trên mấy chủ chỉ khi máy khách có yêu cầu sử dụng. Cách hoạt động của cơ chế này là bạn chỉ cần đăng ký sự hiện diện của đối tượng trên máy chủ(không cần phải cấp phát bộ nhớ và dặt đối tượng trong trạng thái sẵn sàng ).Java cung cấp chương trình rmid.exe đóng nhiệm vụ tiếp nhận sự hiện diện của đối tượng và tự động khởi tạo đói tượng khi máy khách có nhu cầu .Dười đây là chương trình ví dụ.Bạn hãy thực hiện cài đặt chương trình qua các bước sau
Bước 1 : Xây dựng lớp giao tiếp của đối tượng mang tên MyAutoObject
Ví dụ : MyAutoObject.java
Import java.rmi.* ;
Public interface MyAutoObject extends Remote {
Public string callmeremotely() throws RemoteException;
}
Đối tượng MyAutoObject của ta đơn giản chỉ cung cấp 1 phương thức CallmeRemotely() cho trình khách gọi từ xa
Bước 2 : Cài đật chi tiết cho đối tượng MyAutoObject thông qua lớp MyAutoObjectImpl
Ví dụ : MyAutoObjectImpl.java
Import java.rmi.* ;
Import java.rmi.activation.* ;
Public Class MyAutoObjectImpl extends activatable implements MyAutoObject {
// Phương thức khởi dựng dùng kích hoạt đối tượng
// Khi dịch vụ rmid kích hoạt đối tượng nó sẽ gọi phương thức ActivationInstantiator.new.Instance và gián tiếp gọi đến
// Phương thức khởi dựng này
// Id là định danh của đối tượng cần kích hoạt
// Data là dữ liệu bên ngoài cần truyền vào khi đối tượng được kích hoạt
Public MyAutoObjectImpl (ActivationID id,MarshalledObject data) throws RemoteException {
// Đăng ký và thông báo sự hiện diện của đối tượng có khả năng tự kích hoạt với hệ thống
Super ( id , 0 );
}
// Cài đặt phương thức của đối tượng trong giao tiếp MyAutoObject
//
Public String callMeRemotely () throws RemoteException {
Return “Success server call”:
}
}
Khác với cách cài đặt thông thường, đối tượng muốn tự kích hoạt được bởi dịch vụ rmid phảI dẫn xuất thêm từ lớp cha Activatable(Các lóp hỗ trọ cho kỹ thuật tự kích hoạt nằm trong gói thư viện Java.rmi.Activation.* ) .Phương thức khởi dựng của đối tượng phải được thiết lập như sau:
Public MyAutoObjectImpl (ActivationID id,MarshalledObject data) throws
RemoteException {
Super ( id , 0 );
}
Phương thức này nhận 2 đối số, đói số thứ nhất cho biết định danh kích hoạt (ActivationID) do dịch vụ kích hoạt rmid truyền vào .Đối số thứ 2 (Data) có kiểu đối tượng MarshalledObject là đối tượng tổng quát có thể truyền qua lại trên mạng(MarshalledObject là đối tượng được cài đặt giao tiếp SerialiZable ) dùng cho mục đích chung khi bạn muốn truyền thônng tin từ bên ngoài vào trong quá trình đối tượng khởi động. Bạn phải chuyển những thông tiu này lên cho lớp cha bằng cách gọi Super( id,0 ).
Lóp cha là lớp Activatable sẽ thông báo và đăng ký sự hiện diện của đối tượng với dịch vu rmid và máy ảo java. Bạn sẽ nhận rõ cơ chế hoạt động này trong các bước cài đặt chương trình setup.java tiếp theo sau đây :
Bước 3: Viết trình cài đặt và đăng ký khà năng kích hoạt của đôi tượng.
Ví dụ : Setup
Import java.rmi.* ;
Import java.rmi.activation.* ;
Import java.util . properties ;
Public class Setup {
// Chương trình đăng ký đối tượng MyAutoObject với rmid va rmiregistry
//
Public static void main (String[] args) throws Exception {
// Thiết lập lớp bảo vệ cho trình chủ
System.setSecuritymanager(new RMIsecurityManager());
// Với mô hình bảo mật của java1.2 bạn bắt buộc phải chỉ định tập tin chính sách policy quy định chuyển cho máy ảo
// Chạy đối tượng kích hoạt
// Properties là bảng thuộc tính chứa các giá trị cần thiết lập
Properties props = new Properties ( ) ;
// Chỉ định tập tin chứa các thiết lập bảo mật
Props.put(“java.security.policy”,”file:/ C:/network/activate/policy”) ;
// Tạo môI trường chứa các đối tượng kích hoạt
ActivationGroupDesc exampleGroup = new ActivationGroupDesc (props , ace) ;
// Dựa vào thông tin của nhóm, chúng ta yêu cầu hệ thống cung cấp 1 định danh tính kích hoạt cho nhóm
//
ActivationGroupID agi = ActivationGroup.getSystem ().registryGroup(ExampleGroup);
// Sau khi có định danh của nhóm , chương trình yêu cầu hệ thống tạo ra nhóm để chứa các đối tượng kích hoạt.
ActivationGroup.createGroup (agi , exampleGroup , 0);
// Chuỗi “location” là địa chỉ URL nơi lớp đối tượng tồn tại khi nhận được yêu cầu từ máy khác. Dịnh vụ rmid sẽ dựa vào chuỗi này để đI tìm lớp đối tượng trên máy chủ và kích hoạt nó.ở đây chúng ta dùng giao thức file. Nếu có web server bạn có thể dùng giao thức http. Tuy nhiên, nên nhớ kết thúc chuỗi URL bằng kí tự xổ tráI (/)
String location = “file: / D:/network/activate”;
// Tạo tham số cần truyền cho đối tượng khi kích hoạt
// Bạn có thể dùng MarshalledObject làm đối tượng mang thông tin từ bên ngoài vào đối tượng kích hoạt. ở đây ta không càn truyền thông tin gì cả nên data được đặt giá trị bằng null
MarshalledObject data = null;
// Tạo mô tả về đối tượng MyAutoObject cần kích hoạt
ActivationDesc desc = new ActivationDesc (‘’ MyAutoObjectImpl’’ , location , data) ;
// Đăng kí đối tượng với dịch vụ kích hoạt rmid
MyAutoObject mri = (MyAutoObject) Activatable.registry(Desc);
// Đăng kí tên của đối tượng với rmiregistry đẻ máy khách truy tìm
//
System.out.println(“registry Object with rmiregistry”);
Naming.rebind (“rmi : // localhost / MyAutoObjectImpl” , mri);
System.out.println(“avainable for client request”);
System.exit(0);
}
}
Bước đăng kí đối tượng với dịch vụ kích hoạt rmid trông có vẻ phức tạp nhưng đó là nhưng bước java yêu cầu. Các đối tượng cần kích hoạt được quản lí theo từng nhóm. Trước tiên bạn cần chỉ định môI trường mà nhóm sẽ hoạt động :
ActivationGroupDesc.commandEnviroment ace = null ;
ở đây ta sử dụng các giá trị mặc định của môi trường java nên biến ace được đặt giá trị null
Điều kế tiếp cần làm là tạo ra các mô tả nó
ActivationGroupDesc exampleGroup = new ActivationGroupDesc (props , ace);
Kế đến dựa vào mô tả nhóm bạn yều cầu hệ thống cấp cho một định danh ID dành cho nhóm:
ActivationGroupID agi = ActivationGroup.getsysstem().registerGroup(ExampleGroup);
Tiếp theo là tạo nhóm
ActivationGroup.createGroup(agi , exampleGroup,0) ;
Sau đó là mô tả về đối tượng cần kích hoạt
ActivationGroupDesc desc = new ActivationGroupDesc(“MyAutoObjectImpl”,location , data);
Bước cuối cùng là đăng kí đối tượng cần kích hoạt
MyAutoObject mri = (MyAutoObject) activatable.register(desc);
Quá trình trên sẽ cung cấp thông tin cho chương trình dịch vụ rmid(còn gọi là rmi diamond). Với những thông tin trên khi nhận được yêu cầu từ máy khách, rmid sẽ tự động yêu cầu máy chủ tạo và kích hoạt đối tượng để máy khách tham chiếu đến.
Chúng ta vẫn phải thực hiện bước cuối cùng là đăng kí tên đối tượng với rmiregistry :
Naming.rebind(“rmi: // localhost / MyAutoObjectImpl”, mri);
Như bạn thấy đối tượng mri trong phương thức Naming.rebind() không cần tạo ra từ lệnh new mà có được là do đăng kí với dịch vụ rmid
MyAutoObjectImpl = (MyAutoObjectImpl) Activatable.register(desc);
Khi bạn chạy chương trình setup này lệnh Naming.rebind() không còn dừng lại để chờ yêu cầu từ máy khách gửi đến. Nó chỉ thông báo đến rmid là đối tượng đã sắn sàng sau đó thi hành lệnh kế tiếp và chấm dứt chương trình. Khi rmid cần dùng đến đối tượng, rmid sẽ tự động kích hoạt và tạo đối tượng bằng lệnh new sau đó đưa đối tượng vào sử dụng.
Bước 4 : Viết chương trình khách triệu gọi đối tượng từ xa
Ví dụ : Client.java
Import java.rmi.*;
Public Class Client{
Public static void main (String args[] ).{
// Thay localhost bằng địa chỉ IP thích hợp nếu bạn có
String Server = “localhost”;
If (args.length > 1){
Server = args[0];
}
// Thiết lập lớp phòng vệ cho trình khách
//
System.setsecuritymanager(new RMIsecuritymanager());
Try {
String location = “rmi : // “+server+”/ MyAutoObjectImpl”;
// Truy tìm đối tượng
MyAutoObject mri = (MyAutoObject) Naming.lookup(location);
// Triệu gọi phương thức của đối tượng và in kết quả trả về
Result = (String) mri.callMeRemotely();
System.out.println(“returned from Remote call ”);
System,out.println (“result : ” +result);
}
Catch (Exception e) {
E.printStackTrace();
}
}
}
Thiết kế chương trình phía máy khách không có gì khác so với khi không dùng chế độ kích hoạt tự động .Trình khách hoàn toàn không biết được chế độ tự động kích hoạt cảu trình chủ diễn ra như thế nào. Theo cách thông thường trình khách gọi Naming.lookup () để về lấy tham chiều và gọi trực tiếp đến phương thức callMeRemotely()của đối tượng chủ .Trước khi thực hiện biên dịch bạn cần tạo tập tin chứa các quy định bảo mật khi chạy chương trình như sau :
Ví dụ: Nội dung tập tin policy
Grant {
// Không hạn chế quyền truy xuất
Permission java.security.AllPermission ;
};
Đây chỉ là tập tin văn bản bình thường bạn có thể dùng trình soạn thảo notepad của windowns để chỉnh sửa và lưu tập tin dươi tên policy
Bước 5: Biên dịch chương trình và chạy chương trình.Bạn lưu tất cả mã nguồn vào thư mục C:\RMI \ Activate .Chuyển vào thư mục nảy để biên dich và chạy chương trình theo thứ tự sau :
Biên dịch các tập tin .class:
C:\RMI \Activate> javac*.java
Tạo lớp trung gian
C;\RMI\Activate>rmic MyAutoObjectImpl
Khởi động bộ đăng ký Registry:
C:\RMI\Activate>Start rmiregistry
Khởi động bộ quản lý kích hoạt đối tượng:
C:\RMI\Activate>Start rmid
- J-Djava.security.policy = file;/ C:/ network / Activate/policy
(Với tham số –J trình rmid sẽ chuyển toàn bộ tham số –D qua cho máy ảo cho Java tiếp nhận . ở đây ta yêu cầu rmid khởi động nhờ vào tính chất bảo mật quy định trong tập tin policy )
Khởi động trình cài đật setup đăng ký đói tương:
Java-Djava.security.policy = file;/ C:/ network / Activate/policy
- Djava.rmi.server.codebase = file: /C:/network/Activate/Setup
( ở đây trình setup khởi động dựa vào chế độ bảo mật quy định trong tập tin policy tiếp đến là thuộc tính Djava.rmi.codebase yêu cầu java truy tìm các tập tin cần thiết ở thư mục C;/network / activate / )
Khởi động trình khách để triệu gọi đối tượng:
Java- Djava.security.policy =
File :/ C: / network / activation / policy Client
Tùy cơ chế tự động kích hoạt đối tượng hơI phức tạp nhưng hầu hết các hệ thống lập trình phân tán đối tượng đều hỗ trợ cơ chế này . Chúng tiết kiệm tài nguyên của hệ thống và làm cho máy chủ hoạt đọng hiệu quả hơn.