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 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ình phân tán
và công ngh lp trình phân tá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ình phân tán và công ngh RMI
ng dng công ngh RMI xây dng các ng dng phân tá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ình phân tá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ân tán trên nhiu máy. Khi
t ng dng có mã lnh thc thi c phân tán trên nhiu máy thì chng trình ó c
i là chng trình phân tán và vic 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 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ình phân tá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
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ân tá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
}
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
}
}
}
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