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