Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
594,78 KB
Nội dung
Trang 222 Chng 10: LP TRÌNHPHÂNTÁN VI JAVARMI ( REMOTE METHOD INVOKE) Lp trìnhphântán vi RMI là mt trong nhng vn nóng bng ca nn công nghip phn mm ngày nay. giúp các bn có các kin thc c bn v lp trìnhphântán và công ngh lp trình phântán RMI. Chng này ta tho lun v các khía cnh ó. Sau khi hc xong chng này ngi hc có th: Hiu c khái nim v lp trìnhphântán và công ngh RMI ng dng công ngh RMI xây dng các ng dng phântán Chuyn tham s cho phng thc triu gi t xa và nhn kt qu tr v t phng thc triu gi t xa I. RMI và lp trìnhphântán i tng Thông thng mã lnh ca mt chng trình khi thc thi c tp trung trên cùng t máy, ây là cách lp trình truyn thng. S phát trin nh v bão ca mng máy tính c bit là mng Internet toàn cu, ã khin các chng trình truyn thng này không còn áp ng c yêu cu na. Các chng trình bây gi yêu cu phi có s hp tác x lý, tc là mã lnh ca nó ã không tp trung trên mt máy mà c phântán trên nhiu máy. Khi t ng dng có mã lnh thc thi c phântán trên nhiu máy thì chng trình ó c i là chng trìnhphântán và vic lp trình to ra các chng trình này c gi là lp trìnhphân tán. Có rt nhiu công ngh lp trìnhphântán nh: DCOM, CORBA, RMI, EJB trong ó RMI là công ngh thun Java và d lp trình nht. Thông thng nu các i tng c tp trung trên cùng mt máy thì bn có th triu gi các phng thc ca nó bng cách gu cho nó mt thông báo, câu hi t ra là làm th nào có th triu gi các phng thc ca mt i tng nm trên mt máy khác. ây chính là ni dung ca lp trìnhphântán mã lnh RMI (Remote Method Invoke – tm ch là triu gi phng thc t xa). RMI là cách thc giao tip gia các i tng Java có mã lnh cài t (bao gm c phng thc và thuc tính) nm trên các máy khác nhau có th triu gi ln nhau. Hình sau mô hình triu gi i tng phân tán. Trên máy A các i tng A1, A2 i các phng thc ca nhau c gi là triu gi phng thc cc b (local method invoke) ây là cách lp trình hng i tng truyn thng vn s dng, tng t các i ng B1, B2, B3 là các i tng cc b. Tuy nhiên các i tng Java có th triu gi phng thc ca mt i tng nm trên mt máy khác da vào giao thc triu gi t xa RMI. Trong mô hình di ây thì li triu gi phng thc ca i tng B2 ( nm trên máy B) ti tng A1 ( nm trên máy A) là li gi phng thc t xa. Trang 223 II. Gi phng thc t xa và các vn phát sinh Vic triu gi mt phng thc t xa thot nhìn có vn gin nhng thc t li phc tp hn triu gi phng thc cc b. Các i tng trên hai máy khác nhau hot ng trên hai tin trình khác nhau (có hai không gian a ch khác nhau) nên vic tham chiu bin a chi tng là khác nhau. Ví d khi bn truyn mt i tng cho mt phng thc triu gi t xa thì thc s bn truyn mt tham chiu i tng n phng thc t xa, tuy nhiên vùng nh thc s ca i tng li nm trên mt máy khác. Li gi phng thc cc b luôn tr v kt qu thông qua ngn xp trong khi li gi phng thc xa kt qu tr v phi thông qua kt ni mng chính vì vy các s c v truyn thông luôn có th sy ra, nh vy vic bt và kim soát li trong các ng dng phântán là rt t. III. Vai trò ca các lp trung gian i vi li gi phng thc cc b, các tham s truyn vào phng thc cng nh t qu tr v t phng thc c thc hin thông qua ngn xp (stack) trong khi li gi phng thc t xa phi c óng gói và chuyn qua mng. n gin và trong sut i vi ngi lp trình i tng Java trên hai máy khác nhau không triu gi phng thc ca nhau mt cách trc tip mà thông qua lp trung gian. p trung gian tn ti c hai phía: phía máy khách (ni gi phng thc ca i tng xa) và máy ch (ni i tng thc sc cài t). Phía máy khác lp trung gian này c gi là stub (lp móc), phía máy ch lp trung gian c gi là skeletion (lp ni). Ta có th hình dung lp trung gian stub và skel là hai ngi trung gian giúp các i ng xa có th giao dch c vi nhau. Máy A A1 A2 Máy B B1 B2 B3 Máy C C Hình 1: Mô hình triu gi các phng thc t xa Trang 224 Trong hình trên bn có i tng C1 c cài t trên máy C. trình biên dch Java giúp ta to ra hai lp trung gian C1_stub và C1_skel. Lp C1_stub c mang v máy A. Khi A1 trên máy A triu gi phng thc ca i tng C1 nó s chuyn li gi phng thc cho lp trung gian C1_stub. Lp trung gian C1_stub có trách nhim óng gói các tham chuyn tham s qua mng n phng thc c triu gi ca i tng C1. Trên máy C lp trung gian C1_Skel có nhim v nhn các tham s và chuyn vào vùng a ch thích p sau ó gi phng thc tng ng. Kt qu tr v (nu có) ca phng thc do C1 tr sc lp C1_Skel óng gói và chuyn ngc v cho trình khách. Trên máy khách lp trung gian C1_Stub chuyn giao kt qu cui cùng li cho A1. Bng c ch này A1 luôn ngh rng i tng C1 ang tn ti ngay trên cùng máy vi nó nh các i tng cc b khác. Hn na nh có lp trung gian C1_Stub mà khi kt ni mng gp s c thì lp trung gian stub s luôn bit cách thông báo li n i tng A1. Thc t làm cách nào A1 tham chiu c n C1, mt khi không có i tng C1 c cài t trên máy A? C1_Stub trên máy A ch thc hin vic chuyn tham s, nhn kt qu tr v nu có và thc hin các giao thc mng, nó không phi là hình nh ca C1. làm c u này i tng C1 cn cung cp mt giao din tng ng vi các phng thc mà các i tng trên máy khác có th triu gi. Chúng ta tip tc làm sáng tìêu này khi nói giao din t xa. IV. Cài t i tng phântán 1. Giao din t xa Khi bn mun to ra mt s vt t xa thì bn che mt n cài t nn bng cách truyn qua mt giao din. Vy khi khách thu c mt tham chiu n i tng t xa thì thc cht ó là mt giao din. Máy A C1_stub A1 A1 B1_stub Máy C C1_skel C1 Máy B B1 B1_skel Hình 2: Gi phng thc ca i tng thông qua lp trung gian Trang 225 Khi to ra mt giao din t xa, thì bn phi tuân theo các hng dn sau: Giao din t xa phi là mt giao din public, tc là khi to ra mt giao din t xa ta phi thêm t khoá public vào trc nh ngha giao din. Bng không, khi bn tham chiu n i tng t xa bn s thu c mt ngoi l Giao din t xa phi là giao din c k tha t giao din Remote i phng pháp trong giao din t xa phi khai báo RemoteException trong mnh throws bên bt c ngoi l nào khác, tc là tt c các phng thc trong giao din t xa u phi ném ra ngoi l RemoteException u tham s truyn cho phng thc hoc giá tr nhn v t thc triu gi t xa là mt i tng thì i tng ó phi trin khai giao din Remote hoc giao din Serializable Thông thng bn thng thy mt giao din t xa có cu trúc nh sau: import java.rmi.*; public interface RemoteInterface extends Remote{ [public] ReturnDataType method1([DataType arg1,][ DataType arg2,] ) throws RemoteException; [public] ReturnDataType method2() throws RemoteException; } Ví d 1-1: Sau ây là mt giao din t xa n gin ca ng dng HelloRMI HelloRMI.java import java.rmi.*; public interface HelloRMI extends Remote{ public String sayHello() throws RemoteException; } Nhìn vào giao din này ta thy nó ging bt k giao din nào khác ngoi tr nó c rng t giao din Remote và tt c các phng thc trong giao din này u phi nem ra ngoi l RemoteException, bn hãy nh rng tt c các phng thc c khai báo trong giao din s tng là public, th nên trong giao din trên bn có th b t khoá public khi khai báo phng thc sayHello. Bn tin hành biên dch javac HelloRMI.java bn s thu c tp tin HelloRMI.class 2. Trin khai giao din t xa Sau khi bn to ra giao din t xa, công vic tip theo mà bn cn phi làm là trin khai tt c các phng thc trong giao din t xa. Ví d 1-2: Sau ây là cài t ca giao din t xa HelloRMI HelloRMIImpl.java import java.rmi.*; public class HelloRMIImpl implements HelloRMI { public String sayHello() throws RemoteException { return "Hello RMI"; } } Vn t ra là làm th nào cài t i tng HelloRMI lên mt máy (máy 2) và gi phng thc sayHello() ca HelloRMI t máy khác (máy 1)? Nhã nêu trên ta không i c phng thc sayHello ca HelloRMI mt cách trc tip mà cn có thêm hai lp trung gian là HelloRMIImpl_Stub và HelloRMIImpl_Skel. Da vào lp Trang 226 HelloRMIImpl.class, trình biên dch rmic.exe ca Java s giúp ta to ra hai lp trung gian Stub và Skel. Bn m ca s DOS – Prompt và gõ vào dòng lnh Rmic HelloRMIImpl.class t qu bn s thu c hai tp HelloRMIImpl_Stub.class và HelloRMIImpl_Skel.class 3. Cài t, ng kí i tng t xa Bc tip theo sau khi bn cài t giao din t xa là công vic ng ký nó vi trình rmiregistry theo mu sau: Ví d 1-4: Ví d sau là chng trình ng ký và cài t i tng HelloRMIImpl vi trình ch rmiregistry. Setup.java import java.rmi.server.*; import java.rmi.*; import java.net.*; public class Setup { public static void main(String[] args) { // to ra mt th hin ca i tng t xa HelloRMI h=new HelloRMIImpl(); try { // Khai báo i tng có kh nng triu gi t xa UnicastRemoteObject.exportObject(h); // ng ký nó vi trình rmiregistry Naming.bind("//localhost/hello, h); // có th thay phng thc bind bi phng thc rebind nh sau: // Naming.rebind("//localhost/hello, h); } catch (MalformedURLException ex) { } catch (AlreadyBoundException ex) { } catch (RemoteException ex) { } } } Công vic u tiên bn phi làm khi cài t i tng t xa là to ra mt th hin a i tng t xa. HelloRMI h=new HelloRMIImpl(); bn có th thay bng dòng lnh HelloRMIImpl h=new HelloRMIImpl(); Tip theo bn gi phng thc tnh exportObject ca lp UnicastRemoteObject máy o java bit i tng h (HelloRMI) là i tng có kh nng truy xut t xa. UnicastRemoteObject.exportObject(h); u ý s dng c lp UnicastRemoteObject bn phi khai báo import java.rmi.server.*; u chng trình Trang 227 c cui cùng là bn t cho i tng h mt cái tên gi nh và ng ký tên này i bng ký rmiregistry. Phng thc tnh ca lp Naming s thc hin u này Naming.bind("[rmi:]//hostname[:port]/name, h); Phng thc bind có hai tham s: tham s th nht là mt chui nh v URL, i s th hai là bn thân i tng cn ng ký Chui nh v URL có nh dng nh sau: [rmi:]//hostname[:port]/name Trong ó: mri là tên giao thc,ây là phn tu chn, mc nh giao thc là rmi nên bn có th b qua. Hostname là tên ca máy ch hoc a ch IP ca máy ch ni i tng phântán ang n ti. Port là s hiu cng ca chng trình rmiregistry, ây là tham s tu chn, nu b qua tham s này thì cng mc nh là 1009 Name là tên gi nh ca i tng phântán Phng thc bind si vào vòng lp vô hn ch kt ni t máy kách. Các chng trình phía máy khách s da vào chui nh v URL mà ta ng ký vi trình rmiregistry truy tìm tham chiu n i cn dùng. n có th khi ng bng ký rmiregistry này âu? Bn m ca s DOS-Prompt và cho chy chng trình rmiregistry này t dòng lnh nh sau: C:\JDK1.4\bin\rmiregistry.exe u trong WintNT thì bn có th chy nó nh mt dch v bng dòng lnh start C:\JDK1.4\bin\rmiregistry.exe Sau khi khi ng chng trình rmiregistry bng mt trong hai cách bn không thy phn hi gì c bi vì ây là chng trình chy di dng dch v (service). Mc nh rmiregistry lng nghe các kt ni trên cng 1009. Bn có th chnh ng khác cho nó. Ví d lnh sau s khi ng rmiregistry trên cng 2004 C:\Jdk1.4\bin\rmiregistry.exe 2004 Chú ý: Trong java 1 hostname không th là localhost, ngha là nu bn mun th nghim trên máy cc b thì bn phi truyn cho nó mt a ch IP chng hn nh 127.0.0.1 hoc tên ca máy ( bit tên ca máy ca mình bn vào Control Panel\Net Work chn th Indentification và bn s thy tên máy ca mình trong phn Computer Name) RMI s không làm vic chng nào bn cha cài h giao thc TCP/IP. u bn ang kim th trên máy cc b thì bn có thng ký vi trình rmiregistry dn gin nh sau: Naming.bind(“hello”,h); u bn ng ký mt i tng mi vi mt cái tên gi nhã c s dng cho mt i tng khác bn s nhn c mt ngoi l AlreadyBoundException. ngn cn u này bn nên dùng phng thc Naming.rebind() thay cho phng thc Naming.bind() vì Naming.rebind() b sung mt cái tên mi nu nó cha có và thay th mt cái tên ã tn ti i mt i tng mi. Cho dù phng thc main() kt thúc thì i tng t xa bn to ra và ng ký cho nó t cái tên vn còn ó chng nào mà rmiregistry vn còn ang chy và bn không gi Trang 228 phng thc Naming.unbind() thì s vt này vn còn ó. Bi lý do này, khi bn phát trin ng dng ca mình thì bn cn phi tt rmiregistry và cho chy li nó mi khi bn biên dch i i tng t xa. n không nht thit phi khi ng rmiregistry nh mt tin trình ngoài. Nu bn bit ng ng dng ca mình là ng dng duy nht s dùng sng ký. Thì bn có th bt u nó bên trong chng trình ca mình bng dòng lnh: LocateRegistry.createRegistry(Port); ây Port là s hiu cng. u này là tng ng vi vic chy rmiregistry Port t du nhc ca DOS-Prompt 4. Vit trình khách triu gi phng thc ca i tng cài t t xa Trình khách triu gi i tng phântanRMI có th là mt trong các kiu ng dng sau: ng dng console ng dng có giao din ho ng dng Servlet trang JSP … u duy nht bn phi làm trong chng trình khách là tra cu và ly v giao din xa t trình ch. Tó tri vic triu gi phng thc t xa ging nh là triu i phng thc ca bt ki tng cc b nào khác. Sau ây là mu chng trình phía trình khách triu gi i tng phântánRMI import java.rmi.*; import java.rmi.registry*; public Client { public static void main(String args[]) throws RemoteException { // ly v tham chiu i tng phântán bng phng thc Naming.lookup() RemoteInterface r=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”); // triu gi các phng thc ca i tng t xa } } Ví d 1-5: Sau ây là trình khách triu gi i tng HelloRMI Client.java import java.rmi.*; import java.rmi.registry*; public Client { public static void main(String args[]) throws RemoteException {// ly v tham chiu i tng phântán bng phng thc Naming.lookup() HelloRMI r=( HelloRMI)Naming.lookup(“//localhost/hello”); // triu gi phng thc sayHello ca i tng t xa System.out.println(HelloRMI.sayHello()); } } Trang 229 truy tìm i tng xa, chng trình máy khách gi phng thc Naming.lookup(); Phng thc này ch yêu cu i s là chui cho bit a ch ca máy ch và tên ng ký ca i tng. RemoteInterfacer=(RemoteInterface)Naming.lookup(“[rmi:]//hostname[:port]/name”); Mc nh phng thc Naming.lookup() tr v mt tham chiu Object nên bn cn phi ép kiu sang giao din t xa. Bn có th hình dung phng thc Naming.lookup() óng vai trò nh mt dch v tìm kim i tng trên máy ch, nó liên lc vi trình rmiregistry trên máy ch và yêu cu tr tham chiu i tng cho bn s dng. Còn Naming.bind() óng vai trò nh dch v ng ký. Biên dch và chy trình khách Javac Client.java t c sn sàng, bn hãy chy chng trình khách nh sau: Java Client t qu thu c là li chào “Hello RMI” Hình 3 din t c ch gi phng thc t xa ca các i tng RMI mt cách tng quát: ng ký i tng vi trình rmiregistry bng cách gi phng thc Naming.bind() hoc Naming.rebind(). Máy khách mun gi phng thc ca i tng trên máy ch trc ht cn phi gi phng thc Naming.lookup() truy tìm tham chiu n i tng xa theo tên. ng ký s tr v tham chiu ca i tng xa thông qua giao din t xa. a vào giao din t xa mà trình khách có th gi các phng thc ca i tng xa. Khi mt phng thc c gi, li gi sc chuyn n lp trung gian _Stub. Lp trung gian này có nhim vóng gói các tham s và chuyn n lp trung gian _Skel trên trình ch. p trung gian trên máy ch s tip nhn các tham s gi n t trình khách và trc tip yêu cu i tng thc thi phng thc và chuyn kt qu (nu có) v cho trình khách. . Ví d 2: Vit lp Calculator, lp này có các phng thc add, less, mul, div dùng thc hin các phép toán tng ng cng, tr, nhân và chia c 1: to ra giao din t xa - M mt trình son tho bt k gõ vào ni dung nh sau: M¸y kh¸ch M¸y chñ rmiregistry HelloRMIIm pl Naming.bin d Naming.rebi nd Client Naming.looku p 1 2 3 HelloRMI HelloRMIImpl_Stub HelloRMIImpl_Skel 4 5 6 Trang 230 //Calculator.java import java.rmi.*; public interface Calculator extends Remote { float add(float a, float b) throws RemoteException; float less(float a, float b) throws RemoteException; float mul(float a, float b) throws RemoteException; float div(float a, float b) throws RemoteException; } - Ghi li vào th mc C:\NetWork\Server - M ca s DOS-Prompt và gõ vào dòng lnh biên dch nh sau: c 2: Cài t giao din t xa - M trình son tho bt k gõ vào ni dung sau: // CalculatorImpl.java import java.rmi.RemoteException; public class CalculatorImpl implements Calculator { public float add(float a, float b) throws RemoteException { return a+b; } public float less(float a, float b) throws RemoteException { return a-b; } public float mul(float a, float b) throws RemoteException { return a*b; } public float div(float a, float b) throws RemoteException { return a/b; } } - Ghi li vi cái tên CalculatorImpl.java - M ca s DOS_Prompt và gõ vào dòng lnh sau biên dch Trang 231 sau khi biên dch bn thu c tp tin CalcultatorImpl.class c 3 To ra các lp trung gian _Stub và _Skel n m ca s DOS_Prompt và gõ vào dòng lnh Sau khi thc hin xong lnh này bn s thu c hai lp trung gian là CalcultatorImpl_Stub và CalcultatorImpl_Skel trong cùng th mc C:\network\server c 4: ng ký i tng t xa vi trình rmiregistry - Bn m trình son tho bt k và gõ vào ni dung nh sau: // CalculatorSetup.java import java.rmi.server.*; import java.rmi.*; public class CalculatorSetup { public static void main(String[] args) throws Exception{ Calculator c=new CalculatorImpl(); UnicastRemoteObject.exportObject(c); Naming.rebind("rmi://localhost/Cal",c); } } - Ghi li vi cái tên CalculatorSetup.java trong vào th mc c:\network\server - M ca s DOS_Prompt gõ vào dòng lnh sau: [...]...c 5: Kh i ng d ch v ng ký tên rmiregistry n m c a s DOS-Prompt, chuy n vào th m c C:\NetWork\Server và gõ vào dòng l nh sau: Ch ng trình ang ký ã c kh i ng c 6: Kh i ng trình setup n m c a s DOS-Prompt khác gõ vào dòng l nh Chú ý: N u b n không chuy n vào th m c C:\NetWork\Server tr ang ký thì b n s nh n cm tl i Trang 232 c khi kh i ng d ch Ch ng 11: JAVA JSP (JAVA SERVLET) Trang 233 . lp trình to ra các chng trình này c gi là lp trình phân tán. Có rt nhiu công ngh lp trình phân tán nh: DCOM, CORBA, RMI, EJB trong ó RMI. Trang 222 Chng 10: LP TRÌNH PHÂN TÁN VI JAVA RMI ( REMOTE METHOD INVOKE) Lp trình phân tán vi RMI là mt trong nhng vn nóng bng