Lập trình hệ phân tán trong java

46 4 0
Lập trình hệ phân tán trong java

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ BÁO CÁO TÌM HIỂU VỀ LẬP TRÌNH HỆ PHÂN TÁN TRONG JAVA Học phần : Nguyên lý hệ điều hành Sinh viên thực hiện: Nguyễn Thị Huế MSSV: AT13CLC0109 Nguyễn Thị Kim Huế MSSV: AT13CLC0110 Hoàng Đăng Luân MSSV: AT13CLC0115 Giảng viên: Lê Đức Thuận Khoa An toàn thông tin – Học viện kỹ thuật mật mã Hà Nội, 2017 Trang LỜI MỞ ĐẦU Hệ thống máy tính trải qua cách mạng Từ năm 1945 năm 1985, máy tính lớn đắt Hầu hết tổ chức có máy tính khơng biết cách nối chúng Đến năm 1980, hai mở rộng kỹ thuật thay đổi tình hình Thứ phát triển vi xử lý, từ CPU có bit phát triển thành 16, 32, 64 bit Nhiều CPU có lực tính tốn siêu máy tính với giá thấp Sự phát triển thứ hai phát minh mạng máy tính tốc độ cao, mạng cục (Local-area networks-LAN) cho phép hàng trăm máy tính kết nối với để trao đổi thông tin Mạng diện rộng (Wide-area network-WAN) cho phép hàng triệu máy tính trái đất kết nối với tốc độ truyền liệu từ 64Kbps đến gigabits giây Kết cải tiến mặt kỹ thuật đem lại kết nối dễ dàng nhiều hệ thống máy tính với để tạo mạng cao tốc Chúng thường gọi : mạng máy tính hệ phân tán Để xây dựng hệ phân tán hoạt động hiệu tối ưu, nhà thiết kế phải giải nhiều vấn đề có tính chiến lược Tiểu luận nhằm trình bày số vấn đề xây dựng hệ phân tán thông qua ngôn ngữ Java đưa số giải pháp nhằm giải vấn đề Đồng thời tiểu luận cịn đưa số ví dụ minh họa cho vấn đề giải pháp Trang MỤC LỤC Chương 1: TỔNG QUAN VỀ LẬP TRÌNH PHÂN TÁN 1.1.Lập trình phân tán gì? 1.2.Vấn đề gọi phương thức từ xa 1.3.Lập trình phân tán với Java Chương 2: LẬP TRÌNH PHÂN TÁN VỚI RMI 2.1.Giới thiệu: 2.2.Kiến trúc RMI 2.2.1.Giao diện (interface) - trái tim RMI: 2.2.2.Kiến trúc phân tầng RMI 2.3.Cài đặt ứng dụng RMI đơn giản 2.4.MỘT SỐ KHÁI NIỆM TRONG RMI 12 2.4.1.Registry 12 2.4.2.Biến Classpath 14 2.4.3.Codebase 15 2.5.CHUYỂN THAM SỐ TRONG LỜI GỌI PHƯƠNG THỨC TỪ XA 17 2.5.1.Chuyển tham số theo tham trị tham biến 17 2.5.2.Chuyển đối tượng đến trình chủ theo tham trị: 18 2.5.3.Chuyển đối tượng đến trình chủ theo tham biến: 21 2.6.TUẦN TỰ HÓA (SERIALIZABLE) ĐỐI TƯỢNG 25 2.7.MỘT SỐ KỸ THUẬT LẬP TRÌNH PHÂN TÁN VỚI RMI 27 2.7.1.RMI REGISTRY cách đăng ký đối tượng 27 2.7.2.Dùng đối tượng sản sinh nhiều đối tượng 30 2.7.3.Kỹ thuật gọi đối tượng xa phương pháp động ( DYNAMIC METHOD INVOKE ) 34 2.7.4.Tự động kích hoạt đối tượng từ xa (ACTIVITION) 37 2.7.5.Trình mồi nạp ứng dụng từ xa 42 Trang Chương 1: TỔNG QUAN VỀ LẬP TRÌNH PHÂN TÁN 1.1 Lập trình phân tán gì? Lập trình thơng thường máy cục bộ: Các đối tượng chương trình thủ tục , hàm nạp trực tiếp vào nhớ thực thi máy cục Đối với hàm có sẵn thư viện, người ta quan tâm đến tham số truyền cho kết trả Lập trình phân tán việc lập trình máy khác đối tượng chương trình gồm phương thức thuộc tính triệu gọi lẫn Computer A A2 Computer B A1 B1 C1 C2 Computer C Hình 1.1-1: Mơ hình triệu gọi đối tượng từ xa Trong minh họa trên, đối tượng A1 A2 máy A gọi nhau, B1 B2 máy B vậy, lời gọi cục Tuy nhiên, đối tượng A1 máy A gọi đối tượng C1 máy C hay B1 máy B gọi C1 máy C, lời gọi từ xa 1.2 Vấn đề gọi phương thức từ xa Trên máy cục bộ, phương thức chương trình quản lý định vị vùng nhớ, người lập trình cho phép thực lời gọi cách bình thường mà khơng cần quan tâm đến việc chúng giao tiếp với Còn phương thức máy khác hoạt động hai tiến trình, khơng gian địa khác nên việc truyền tham số, tham chiếu đến địa thực thông thường trong máy Trang Lời gọi phương thức cục ln đưa kết quả, có nghĩa thực việc gọi phương thức từ xa khơng thực cố mạng Đối với hàm máy cục bộ, tham số truyền cho hàm thường đưa vào ngăn xếp chương trình lấy để thực tham số truyền cho hàm xa phải đóng gói chuyển qua mạng theo giao thức mạng đến nơi cần đến 1.3 Lập trình phân tán với Java Java ngơn ngữ hỗ trợ lập trình phân tán với hai thư viện chuẩn RMI CORBA RMI chế gọi phương thức từ xa tích hợp ngơn ngữ Java Phương pháp lập trình RMI phương pháp hướng đối tượng, thao tác hay lời gọi phương thức liên quan đến đối tượng CORBA (Common Object Request Broker Architecture) đặc tả OMG (Object Management Group) dành cho việc đạt tính tương tác nút tính tốn phân tán Mục tiêu CORBA định nghĩa cấu trúc mà cho phép mơi trường khơng đồng liên lạc mức đối tượng, không quan tâm đến người thiết kế hai điểm cuối ứng dụng phân tán Corba ngôn ngữ trung lập thực thi rộng rãi platform khác *Sự khác RMI CORBA: - RMI phần J2SDK hàm thư viện hỗ trợ lời gọi phương thức từ xa trả giá trị cho ứng dụng tính tốn phân tán Ở ngôn ngữ Java sử dụng phía gọi phía bên phương thức gọi - CORBA chuẩn công nghiệp cho phép gọi phương thức từ xa nhận kết trả Nhưng khơng giống RMI, sử dụng bên phía gọi bên phía phương thức gọi sử dụng ngơn ngữ lập trình khác nhau, bao gồm trường hợp hai bên không sử dụng ngôn ngữ Java - RMI tập hàm thư viện đơn giản hai bên sử dụng ngơn ngữ lập trình kiến trúc máy Điều làm cho vấn để triệu gọi phương thức từ xa dễ giải - Bộ phát triển J2SDK hỗ trợ RMI CORBA, cho phép đối tượng Java gọi đối tượng CORBA sử dụng hai cách tiếp cận khác Trong giới hạn tiểu luận tìm hiểu phương pháp lập trình phân tán RMI Trang Chương 2: LẬP TRÌNH PHÂN TÁN VỚI RMI 2.1 Giới thiệu: RMI (Remote Method Invoke)– triệu gọi phương thức từ xa - công nghệ SUN giới thiệu JDK 1.1 (2/1997) mở thời kì cho lĩnh vực lập trình mạng Được thiết kế tương đối dễ sử dụng RMI công nghệ mạnh, cung cấp đầy đủ cơng cụ để người lập trình phát triển ứng dụng phân tán cách tốt Mục đích việc thiết kế RMI cho phép người lập trình phát triển chương trình phân tán Java với cú pháp ngữ nghĩa giống lập trình thơng thường Để làm việc này, họ ánh xạ lớp đối tượng làm việc máy ảo Java đơn thành lớp đối tượng làm việc môi trường phân tán 2.2 Kiến trúc RMI 2.2.1 Giao diện (interface) - trái tim RMI: Kiến trúc RMI dựa nguyên lý quan trọng: định nghĩa hành vi việc mô tả hành vi hai khái niệm riêng biệt RMI chấp nhận mã định nghĩa hành vi mã mô tả hành vi tách rời chạy máy ảo Java độc lập Điều cần làm hệ thống phân tán máy khách định nghĩa dịch vụ mong muốn máy chủ nơi cung cấp dịch vụ Trong RMI, việc định nghĩa dịch vụ từ xa viết interface Java Mô tả chi tiết dịch vụ từ xa viết lớp - class Yếu tố cần hiểu RMI là: giao diện định nghĩa hành vi đối tượng từ xa lớp mơ tả định nghĩa Hình 2.2-1: Giao diện lớp mô tả giao diện Trang Một giao diện không chứa mã thực thi RMI hỗ trợ hai lớp mô tả giao diện giống Lớp thứ mơ tả hành vi chạy server Lớp thứ hai hoạt động đối tượng trung gian cho dịch vụ từ xa chạy Client Biểu đồ minh họa Service Client Service Proxy Server RMI Service Implementation Một chương trình Client thực lời gọi phương thức thông qua đối tượng trung gian (proxy), RMI gửi đến máy ảo từ xa từ đến đối tượng mơ tả Bất kì giá trị trả tạo đối tượng mô tả gửi trở proxy sau proxy chyển đến chương trình máy khách 2.2.2 Kiến trúc phân tầng RMI RMI xây dựng từ lớp trừu tượng Client Program RMI System Server Program Stub & Skeletons Stub & Skeletons Remote Reference Layer Remote Reference Layer Transport Layer Hình 2.2-1: Kiến trúc phân tầng RMI Trang Client Object Remote Object Stub Skeleton Remote Reference Layer Remote Reference Layer TCP Transport Layer Transport Layer Hình 2.2-2: Hoạt động thành phần kiến trúc RMI Việc dùng kiến trúc phân lớp nên lớp cải tiến thay mà không ảnh hưởng đến tính chất hệ thống Ví dụ lớp transport thay lớp theo phương thức kết nối UDP/IP mà không ảnh hưởng lớp *Lớp trung gian (STUB SKELETON) Việc gọi phương thức từ xa không giống gọi phương thức thông thường máy Vì thế, lập trình phân tán, chế gọi từ xa đối tượng hai máy khác không gọi trực tiếp lẫn mà thông qua lớp trung gian Người lập trình khơng cần phải quan tâm lớp trung gian chứa làm việc Lớp trung gian đón đầu lời gọi phát sinh từ Client đến biến tham chiếu giao diện gửi lại lời gọi cho dịch vụ RMI từ xa Lớp trung gian tồn hai phía máy khách (nơi thực lời gọi) máy chủ (nơi cài đặt đối tượng gọi) Phía máy khách, lớp trung gian gọi Stub phía máy chủ, lớp trung gian gọi Skeleton Trang A2 Computer B B1_skel A1 B1_stub Computer A C1_stub B1 Computer C C1_skel C1 C2 Hình 2.2-3: Vai trò lớp trung gian stub skel Trong Java SDK, lớp skeleton khơng cịn RMI dùng reflection để tạo kết nối đến đối tượng dịch vụ từ xa *Remote Reference Layer Lớp làm phiên dịch quản lý tham chiếu tạo từ Client đến đối tượng từ xa Lớp Remote Reference Layers định nghĩa hỗ trợ ngữ nghĩa lời gọi kết nối RMI Lớp cung cấp đối tượng RemoteRef, đối tượng đại diện cho liên kết đến đối tượng thực dịch vụ từ xa Đối tượng stub dùng phương thức invoke() RemoteRef để chuyển tiếp lời gọi phương thức Đối tượng RemoteRef hiểu ngữ nghĩa từ lời gọi từ xa Trong JDK 1.1, RMI cung cấp cách cho Client để kết nối đến dịch vụ từ xa: unicast – nối Trước Client dùng dịch vụ từ xa, dịch vụ từ xa phải cài đặt Server export RMI Nếu dịch vụ chính, phải đặt tên đăng kí đến RMI Registry Trong Java SDK, RMI thêm ý nghĩa cho kết nối client-server Trong phiên này, RMI hỗ trợ đối tượng từ xa tích cực Khi lời gọi phương thức tạo từ proxy đến đối tượng activatable remote objects, RMI xác định đối tượng dịch vụ từ xa Trang không hoạt động, RMI khởi tạo đối tượng khơi phục trạng thái từ file đĩa Có thể có kiểu kết nối khác VD: với multicast, proxy đơn gửi yêu cầu đến nhiều đối tượng mô tả đồng thời… nhận đáp trả *Transport Layer - Tầng vận chuyển Tầng có nhiệm vụ tạo kết nối hai máy ảo Java (JVM) Tất kết nối kết nối mạng dùng giao thức TCP/IP Nếu hai máy ảo chạy máy vật lý, chúng kết nối thơng qua giao thức ngăn xếp TCP/IP máy tính Điều lí giải ta phải có cấu hình TCP/IP máy tính ta chạy ví dụ TCP/IP cung cấp kết nối an toàn hai máy dựa địa IP số hiệu cổng Trong phiên RMI tại, kết nối TCP/IP dùng cho tất kết nối từ máy đến máy khác Lúc đầu dùng TCP/IP, RMI dùng giao thức JRMP, giao thức Nhưng sau, có hai phiên Phiên phát hành với JDK 1.1, RMI yêu cầu dùng lớp Skeleton server Phiên thứ phát hành với Java SDK Nó cải tiến để đạt hiệu không yêu cầu lớp skeleton Một vài thay đổi với Java SDK interface khơng địi hỏi kế thừa từ java.rmi.Remote phương thức không cần thiết ném ngoại lệ RemoteException SUN IBM liên kết làm việc cho phiên RMI gọi RMI-IIOP, RMI-IIOP dùng giao thức IIOP để thay cho JRMP 2.3 Cài đặt ứng dụng RMI đơn giản Ở ứng dụng phân tán RMI đơn giản này, ta cần có hai chương trình, chương trình chạy Server chờ phục vụ yêu cầu tính tốn chương trình u cầu chạy máy Client Trang 10 import java.rmi.*; import java.util.*; interface Timer extends Remote { public Date getCurrentTime () throws RemoteException; } // TimerImpl.java import java.rmi.*; import java.util.*; class TimerImpl implements Timer { public Date getCurrentTime () throws RemoteException { System.out.println (“Client request time”); return new Date(); } } Timer đối tượng RMI, cung cấp phương thức getCurrentTime() gọi từ xa máy khách, phương thức trả ngày hành máy chủ Bước 2: Đặc tả giao tiếp cài đặt đối tượng News //News.java import java.rmi.*; interface News extends Remote { public String getTodayNews () throws RemoteException; } // NewsImpl.java import java.rmi.*; class NewsImpl implements News { String news[] = { “Intel che tao chip Atom 16 loi”, “Facebook bi chan o Viet Nam”, “Kho dia chi IPv4 da can kiet”, }; static int index = 0; public String getTodayNews () throws RemoteException { System.out.println (“Client request news”); index ++; if (index >2) index = 0; return news[index]; } } Trang 32 News đối tượng RMI, cung cấp phương thức getTodayNews() trả thông tin cập nhật nhất, getTodayNews() lấy thông tin từ mảng news[] Trong ứng dụng thực tế, ta cung cấp thơng tin cho trình khách từ sở liệu hay nguồn tin Đối tượng News ta có khả cung cấp tin mà Bước 2: Đặc tả giao tiếp cài đặt đối tượng Factory //FactoryService.java import java.rmi.*; interface FactoryService extends Remote { public News createNews () throws RemoteException; public Timer createTimer () throws RemoteException; } //FactoryServiceImpl.java import java.rmi.*; import java.rmi.server.*; class FactoryServiceImpl implements FactoryService { News newsObject = new NewsImpl (); Timer timerObject = new TimerImpl (); public FactoryServiceImpl () { try { // Thông báo khả triệu gọi từ xa đối tượng UnicastRemoteObject.exportObject (newsObject); UnicastRemoteObject.exportObject (timerObject); } catch (Exception e) { System.out.println(e);} } public News createNews () throws RemoteException { return newsObject; } public Timer createTimer () throws RemoteException { return timerObject; } } Trình khách giao tiếp với FactoryService gọi createNews() createTimer() để tạo đối tượng News Timer Phương thức khởi tạo FactoryService có nhiệm vụ kiến tạo thể hai đối tượng đồng thời gọi UnicastRemoteObject.exportObject() để thông báo khả triệu gọi từ xa News Timer cho máy ảo Java Trang 33 Bước 4: Xây dựng trình cài đặt đối tượng đăng ký FactoryService với rmiregistry //Setup.java import java.rmi.*; import java.rmi.server.*; class Setup { public static void main (String srgs[]) throws Exception{ System.out.println (“Factory object created”); // Tạo đối tượng FactoryService obj = new FactoryServiceImpl(); UnicastRemoteObject.exportObject(obj); // đăng ký FactoryService với rmiregistry Naming.bind(“rmi://localhost/factObj”, obj); } } Trình Setup.java thường lệ chịu trách nhiệm tạo đối tượng FactoryService đăng ký đối tượng với rmiregistry Trình khách muốn gọi News Timer cần nhớ tên đăng ký FactoryService với rmiregistry factObj Liên hệ với FactoryService, trình khách có tham chiếu để gọi đến News Timer Bước 5: Xây dựng trình khách //Client.java import java.rmi.*; import java.rmi.server.*; class Client { public static void main (String args[])throws Exception{ //Liên hệ với đối tượng FactoryService FactoryService service = (FactoryService) Naming.lookup(“rmi://localhost/factObject”); // Yêu cầu FactoryService cung cấp đối tượng news Timer News news = service.createNews(); Timer timer = service.createTimer(); // Triệu gọi phương thức đối tượng news Timer System.out.println (“Current: ” + timer.getCurrentTime()); System.out.println (“We have news: ” + news.getTodayNews()); Trang 34 // Dừng giây Thread.sleep(1000); // Triệu gọi phương thức đối tượng news Timer System.out.println (“Current: ” + timer.getCurrentTime()); System.out.println (“We have news: ” + news.getTodayNews()); } } Như ta thấy, trình khách tham chiếu đến FactoryService cách: FactoryService service = (FactoryService) Naming.lookup(“rmi://localhost/factObj”); Có đối tượng service, trình khách yêu cầu service cung cấp cho tham chiếu đến hai đối tượng News Timer phương thức createNews() createTimer() Sau đó, Client gọi phương thức getCurrentTime() getTodayNews() để lấy hành thông tin máy chủ 2.7.3 Kỹ thuật gọi đối tượng xa phương pháp động ( DYNAMIC METHOD INVOKE ) Qua chương trình trên, ta thấy trình khách muốn gọi phương thức trình chủ cần thiết phải cung cấp lớp giao tiếp interface thân đối tượng Trình khách dựa vào interface để chuyển kiểu đối tượng dạng tường minh sau nhận tham chiếu đến đối tượng hàm Naming.lookup(), ví dụ: PingServer server=(PingServer)Naming.lookup("rmi://localhost/pingobject"); Trong Java cho phép ta gọi phương thức xa mà không cần lớp giao tiếp interface cách sử dụng kỹ thuật phản chiếu (reflect) để gọi phương thức động Với phương pháp này, trình khách lấy tham chiếu đối tượng hàm Naming.lookup() dạng tổng quát Object, sau gọi phương thức getMethod(), trình khách biết phương thức mà đối tượng nắm giữ Hàm invoke() giúp trình khách thực thi phương thức bên đối tượng Ví dụ: Bước 1: Đặc tả giao tiếp cho lớp đối tượng Friend //Friend.java import java.rmi.*; Trang 35 interface Friend extends Remote{ public String greeting(String name) throws RemoteException; } Bước 2: Cài đặt chi tiết cho đối tượng //FriendImpl.java import java.rmi.*; class FriendImpl implements Friend{ public String greeting(String name) throws RemoteException{ return ("Hi "+name+ "! Nice to meet you"); } } Bước 3: Thiết lập đăng ký đối tượng máy chủ //Setup.java import java.rmi.*; import java.rmi.server.*; class Setup { public static void main(String args[]) throws Exception{ Friend obj=new FriendImpl(); UnicastRemoteObject.exportObject(obj); System.out.println("Friend waiting for client request "); Naming.bind("rmi://localhost/myfriend", obj); } } Bước 4: Viết chương trình máy Client //Client.java import java.rmi.*; import java.lang.reflect.*; class Client { public static void main(String args[]) throws Exception{ //Tìm tham chiếu đối tượng Object o=Naming.lookup("rmi://localhost/myfriend"); //Truy tìm xuất xứ lớp Class c = o.getClass(); //Định kiểu phương thức cần gọi Class[] parameterTypes = new Class[] {String.class}; Trang 36 //Truy tìm phương thức cần gọi Method theMethod; theMethod = c.getMethod("greeting", parameterTypes); //Định đối số truyền vào phương thức cần gọi Object[] arguments = new Object[] {"Johny"}; //Gọi phương thức nhận kết trả String result = (String) theMethod.invoke(o, arguments); System.out.println(result); } } Chương trình khách Client lấy tham chiếu đến đối tượng myfriend máy chủ dạng tổng qt Object Chương trình khơng sử dụng lớp Friend.class để chuyển kiểu, thay vào ta tìm cách khảo sát nội dung đối tượng Trước hết, ta dùng lớp Class tổng quát để lấy xuất xứ lớp mà đối tượng thể Class c = o.getClasss(); Tiếp đến, đối tượng ta có chứa phương thức greeting() dùng để yêu cầu tham số có kiểu String.Ta cung cấp thơng tin để Java lấy phương thức cần gọi sau: // Định kiểu tham số phương thức cần gọi Class[] parameterTypes = new Class[] {String.class}; // Yêu cầu Java truy tìm phương thức cần gọi Method theMethod; theMethod = c.getMethod("greeting", parameterTypes); Công việc gọi phương thức Đối tượng theMethod cung cấp phương thức invoke() để gọi phương thức mà trỏ đến Trước gọi phương thức, ta cần tạo danh sách đối số để truyền vào phương thức sau: Object[] arguments = new Object[] {"Johny"}; Bước cuối triệu gọi gián tiếp phương thức: String result = (String) theMethod.invoke(o, arguments); Phương thức invoke() yêu cầu đối số, đối số thứ đối tượng chứa phương thức, đối số thứ hai danh sách đối số cần truyền vào phương thức Trang 37 2.7.4 Tự động kích hoạt đối tượng từ xa (ACTIVITION) Theo trình bày phần trước quy trình thực cài đặt máy chủ là:  Chạy chương trình rmiregistry để khởi động đăng kí hay gọi hàm LocateRegistry.createRegistry()  Tạo đối tượng từ xa máy chủ đăng kí với rmiregistry  Lắng nghe yêu cầu hay lời gọi phương thức từ máy khách Cách cài đặt cổ điển thích hợp với hệ thống có đối tượng phục vụ Nếu máy chủ có số lượng lớn (khoảng vài nghìn) đối tượng chúng có khả phục vụ cho máy khách để sử dụng đối tượng ta phải đăng kí tất chúng với rmiregistry, cịn phải dành không gian nhớ lớn để lưu trữ tất Sau đó, tất đối tượng đặt trạng thái chờ máy khách Điều làm thời gian người lập trình, hao phí nhiều tài ngun khơng phải tất đối tượng yêu cầu vào thời điểm Để giải vấn đề trên, Java cung cấp chế tự kích hoạt đối tượng (activation) máy chủ có yêu cầu sử dụng đối tượng Cách hoạt động chế ta cần đăng kí diện đối tượng máy chủ (không cần cấp phát nhớ đặt đối tượng trạng thái sẵn sàng) Java cung cấp chương trình rmid.exe làm 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 yêu cầu  Chương trình minh họa: Bước 1: Xây dựng lớp giao tiếp đối tượng mang tên MyAutoObject // MyAutoObject.java import java.rmi.*; interface MyAutoObject extends Remote { public String callMeRemotely() throws RemoteException; } Đối tượng MyAutoObject đơn giản cung cấp 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 Trang 38 //MyAutoObjectImpl.java import java.rmi.*; import java.rmi.activation.*; class MyAutoObjectImpl extends Activatable implements MyAutoObject{ public MyAutoObjectImpl (ActivationID id, MarshalledObject data) throws RemoteExeption { super(id, 0); } public String callMeRemotely() throws RemoteException { return “Success Server Call”; } } Giải thích: 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 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 kích hoạt tự động nằm gói thư viện java.rmi.activation.* Phương thức khởi tạo super(id, 0) nhận hai đối số: đối số thứ cho biết định danh kích hoạt dịch vụ kích hoạt rmi truyền vào Đối số thứ hai (data) có kiểu đối tượng MarshalledObject đối tượng tổng quát truyền qua lại mạng, dùng cho mục đích chung ta muốn truyền thơng tin từ bên ngồi vào q trình đối tượng khởi động MarshalledObject giống đối tượng khác muốn truyền được cài đặt giao diện Serializable Khi ta cung cấp thông tin id data cho phương thức khởi tạo, lớp cha lớp Activatable thơng báo đăng kí diện đối tượng với dịch vụ rmid máy ảo Java Bước 3: Viết chương trình cài đặt đăng kí khả kích hoạt đối tượng // Setup.java import java.rmi.*; import java.rmi.activation.*; import java.util.Properties; Trang 39 class Setup { public static void main (String [] args) throws Exception { System.setSecurityManager (new RMISecurityManager()); Properties prop = new Properties(); prop.put (“java.security.policy”, “”); // tạo môi trường chứa đối tượng cần kích hoạt ActivationGroupDesc.CommandEnvironment ace = null; // tạo thơng tin nhóm chứa đối tượng cần kích hoạt ActivationGroupDesc exampleGroup = /* dựa vào thơng tin nhóm, ta u cầu hệ thống cung cấp định danh kích hoạt cho nhóm*/ ActivationGroupID agi = /* sau có định danh nhóm, chương trình u cầu hệ thống tạo nhóm ActivationGroup.createGroup(agi, exampleGroup,0); /* Khi nhận yêu cầu từ máy khách, dịch vụ rmid dựa vào chuỗi URL biến location để tìm lớp đối tượng máy chủ kích hoạt nó.Ta sử dụng giao thức file http*/ String location = "file:/E:/Luanvan/EXAM/activation"; // Tạo tham số cần truyền cho đối tượng kích hoạt MarshalledObject data = null; //Tạo mơ tả đối tượng MyAutoObjectImpl cần kích hoạt ActivationDesc desc = new ActivationDesc Acti để chứa đ // Đăng kí đối tượng với rmiregistry để máy khách truy tìm MyAutoObject rmi = (MyAutoObject)Activatable.register (desc); System.out.println(“Register object with rmiregistry”); Naming.rebind(“rmi://localhost/MyAutoObjectImpl”, rmi); System.out.println(“Availble for client request”); System.exit(0); } } Các đối tượng cần kích hoạt quản lý theo nhóm Trước tiên, ta cần định mơi trường mà nhóm hoạt động Trang 40 ActivationGroupDesc.CommandEnvironment ace = null; đây, ta sử dụng giá trị mặc định môi trường Java nên biến ace đặt giá trị null - Kế tiếp, ta tạo mơ tả nhóm: ActivationGroupDesc exampleGroup = new ActivationGroupDesc(prop, ace) - Tiếp theo, dựa vào mơ tả nhóm, ta u cầu hệ thống cấp cho nhóm định danh id ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(exampleGroup); - Tiếp theo, ta tạo nhóm dựa vào định danh có ActivationGroup.createGroup(agi, exampleGroup,0); - Sau tạo mơ tả đối tượng kích hoạt với tên, vị trí, liệu truyền vào ActivationDesc desc = new ActivationDesc (“MyAutoObjectImpl”, location, data); - Cuối đăng kí đối tượng cần kích hoạt MyAutoObject rmi = (MyAutoObject)Activatable.register (desc); Quá trình cung cấp thơng tin cho rmid (rmi diamond) Với thông tin này, 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”, rmi); Ta 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 MyAutoObject rmi = (MyAutoObject)Activatable.register (desc); Khi ta chạy chương trình Setup, lệnh Naming.rebind() khơng cịn dừng lại để chờ 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 4: Viết chương trình khách //Client.java Trang 41 import java.rmi.*; class Client { public static void main (String args[]){ String server = “localhost”; if(args.length > 1) server = args[0]; System.setSecurityManager (new RMISecurityManager()); try { String location = “rmi://”+server+”/MyAutoObjectImpl”; MyAutoObject rmi = (MyAutoObject) Naming.lookup (location); String result = (String)rmi.callMeRemotely(); System.out.println(“Returned from remote call ”); System.out.println(“Result: “+result); } catch (Exception e){e.printStackTrace();} } } Trình khách hồn tồn khơng biết chế tự động kích hoạt 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() đối tượng chủ Trước thực biên dịch, ta cần thiết lập chế độ bảo mật tập tin policy sau: //java.policy grant{ permission java.security.AllPermission; }; Bước 5: Dịch thực thi chương trình Tuy chế tự động kích hoạt đối tượng 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ế Cơ chế làm tiết kiệm tài nguyên hệ thống làm cho máy chủ thực hiệu Trang 42 2.7.5 Trình mồi nạp ứng dụng từ xa Điều thú vị hệ thống mạng cho phép ta kết nối giao tiếp điều khiển từ xa Một câu hỏi đặt có cách để viết ứng dụng hoàn chỉnh đặt máy chủ sau từ máy khách khơng phải cài đặt mà ta gọi ứng dụng hay khơng? Với chế RMI gọi hàm từ xa mà Java cung cấp, ta hồn tồn thực ý tưởng Trong Java, nạp lớp RMIClassLoader cho phép chương trình máy khách nạp lớp chương trình máy chủ theo giao thức http RMIClassLoader chịu trách nhiệm đem tất lớp hay lớp thư viện mà lớp chương trình cần đến Điều tương tự chế làm việc Applet Trong trường hợp Applet, trình duyệt Browser nạp lớp dễ thấy Tất lớp thư viện hay lớp mà Applet dùng đến đặt máy chủ trình duyệt tự download đầy đủ trước Applet thực thi Dưới chương trình ví dụ triệu gọi ứng dụng từ xa Ứng dụng ta thiết kế theo mơ hình phân tán, ứng dụng gọi phương thức đối tượng xa Đối tượng từ điển có trách nhiệm dị tìm trả ý nghĩa từ ứng dụng yêu cầu Toàn ứng dụng đặt Web server máy chủ Chương trình khách cần dùng lớp RMIClassLoader để triệu gọi ứng dụng từ Web server Thiết kế chương trình máy chủ: //Dictionary.java import java.rmi.*; interface Dictionary extends Remote { public String findWord (String keyword) throws RemoteException; } //DictionaryImpl.java import java.rmi.*; class DictionaryImpl implements Dictionary { String wordlist[]; String meaning[]; public DictionaryImpl(){ wordlist = new String[3]; meaning = new String[3]; wordlist[0] = “one”; meaning[0] = “mot”; wordlist[1] = “two”; meaning[1] = “hai”; Trang 43 wordlist[2] = “three”; meaning[2] = “ba”; } public String findWord (String keyword) throws RemoteException { for (int i=1; i

Ngày đăng: 15/08/2022, 13:57

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan