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
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ân tá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â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
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