Tham chiếu ngược (Callback) của đối tượng Corba
RMI có khả năng tham chiếu ngược (callback), đó là lời triệu gọi của trình chủ ngược về các đối tượng cài đặt trên máy khách. Đối tượng Corba cũng cho phép bạn thực hiện điều này. AtServer là đối tượng Corba cài đặt trên máy chủ. AtClient là đối ...
RMI có khả năng tham chiếu ngược (callback), đó là lời triệu gọi của trình chủ ngược về các đối tượng cài đặt trên máy khách. Đối tượng Corba cũng cho phép bạn thực hiện điều này.
AtServer là đối tượng Corba cài đặt trên máy chủ. AtClient là đối tượng Corba chạy trên máy khách. Chương trình khách triệu gọi AtServer trên máy chủ và gọi tham chiếu của AtClient đến trình chủ. AtServer sử dụng tham chiếu của AtClient để gọi ngược từ máy khách.
Đặc tả đối tượng AtClient và AtServer bằng ngôn ngữ IDL được khai báo như sau:
Ví dụ 7.1:ClientServer.idl
Interface AtClient{
void callClientMethod(in string message);
};
Interface AtServer{
void registerClient(in AtClient c)
void callServerMethod(in string message);
};
Tập tin Client Server.idl đặc tả cả hai interface cho AtClient và AtServer. Bạn dùng trình biên dich idlj để dịch ClientServer.idl thành các tập tin Java phục vụ cho cả hai phía khách, chủ như sau:
idlj - fserver - oldImplBase ClientServer.idl
idlj - fclient - oldImplBase ClientServer.idl
Cài đặt AtClient và AtServer. Giao diện (interface) AtClient được cài đặt thành đối tượng Corba AtClientServant còn giao diện AtServer được cài đặt thành đối tượng Corba AtServant như sau:
Ví dụ 7.2: AtClientServant.java
public class AtClientServant extends _AtClientImplBase{
public void callClientMethod(String message){
System.out.println(message);
}
}
Ví dụ 7.3: AtServerServant.java
public class AtServerServant extends _AtServerImplBase
{
AtClient client;
public void registerClient(AtClient c){
client=c;
}
public void callServerMethod(String message){
System.out.println(message);
for ( int i=1;i<10;i++){
String msg="Server response "+ Math.random()*1000;
//Trieu goi phuong thuc cua doi tuong chay tren may khach
client.callClientMethod(msg);
}
}
}
Xây dựng trình chủ dùng cài đặt và đăng ký đối tượng AtServer trên máy chủ
Ví dụ 7.4:Setup.Java
import org.omg.Corba.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
public class Setup{
public static void main(String [] args)throws Exception{
System.out.println("Corba Client");
//Tao doi tuong AtClient
ORB Orb=ORB.init(args,null);
AtServerServant servant= new AtServerServant();
//ket noi AtClient voi trình môi gioi
Orb.connect(servant);
org.omg.Corba.Object nameService=Orb.resolve_initial_references("NameService");
NamingContext nsContext=NamingContextHelper.narrow(nameService);
NameComponent nc= new NameComponent("AtServerObject","");
NameComponent path[]={nc};
nsContext.rebind(path,servant);
//Tao doi tuong Java
java.lang.Object obj=new java.lang.Object();
//VOng lap vo tận chờ nhân yêu cầu của máy khách
synchronized (obj){
obj.wait();
}
}
}
Cài đặt trình khách,triệu gọi đối tượng AtServer trên máy chủ
import org.omg.Corba.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
public class Client{
public static void main(String [] args)throws Exception{
System.out.println("Corba Client");
//Tao doi tuong AtClient
ORB Orb=ORB.init(args,null);
AtClientServant clientservant= new AtClientServant();
//ket noi AtClient voi trình môi gioi
Orb.connect(clientservant);
/*Yêu cau dich vu COS Naming truy tìm tham chieu cua AtServer thông qua tên gu1ECDi” AtServerObject”*/
org.omg.Corba.Object nameService=Orb.resolve_initial_references("NameService");
NamingContext nsContext=NamingContextHelper.narrow(nameService);
NameComponent nc=new NameComponent("AtServerObject","");
NameComponent path[]={nc};
AtServer Serverservant=AtServerHelper.narrow(nsContext.resolve(path));
Serverservant.registerClient(clientservant);
//Trieu goi doi tuong chu
Serverservant.callServerMethod("Client request");
}
}
Biên dịch và chạy chương trình
Với chương trình bên server
javac *.java
start tnameserv
java Setup
Với chương trình bên Client
javac *.java
start tnameserv
java Client