24/05/2018, 19:37

Gọi các phương thức động (Dynamic Method Call) của đối tượng Corba

Trong Java,bạn có thể dùng kỹ thuật phản chiếu(reflect) để truy tìm các phương thức trong đốitượng Corba.Cơ chế này giúp bạn có thể gọi phương thức của một đối tượng Corba bấtkỳ mà không cần dùng đến lớp giao tiếp interface do trình chủ cung ...

Trong Java,bạn có thể dùng kỹ thuật phản chiếu(reflect) để truy tìm các phương thức trong đốitượng Corba.Cơ chế này giúp bạn có thể gọi phương thức của một đối tượng Corba bấtkỳ mà không cần dùng đến lớp giao tiếp interface do trình chủ cung cấp. Điều này tương tự cơ chế gọi phương thức của những đối tượng RMI.Sau đây là chương trình ví dụ:Đối tượng Friend của ta là một đối tượng Corba cung cấp phương thức greeting() để trình khách triêụ gọi.Trình khách không dùng trực tiếp lớp Friend.class do idlj sinh ra để triệu gọi phương thức greeting().Thay vào đó trình khách sử dụng kỹ thuật reflect của Java để triệu gọi greeting().Chương trình gồmcác bước sau:

Bước 1:Đặc tả đối tượng Friend bằng ngôn ngữ IDL

Ví dụ: Friend.idl

Interface Friend{

String greeting (in string name);

};

Tiếp đến ta dùng trình dịch idlj để chuyển đổi đặc tả thành các tập tin cần dungcho cả hai phía khách chủ.

idl- fall Friend.idl

Lưu ý :Thay cho tham số dòng lệnh- fserver và –fclient hoặc ta dùng –fall để yêucấu trình dịch idlj sinh ra các tập tin trung gian phục vụ cho cả hai phía khách chủ.

Bước 2: Phần cài đặt cho đối tượng Corba Friend trong Java được thực hiện thông qua lớp FriendServant như sau:

Ví dụ: FriendServant.Java

public class FriendServant extends_FriendImplBase{

public String greeting(String name){

return ”Hello”+ name+ ”from Corba!”;

}

}

Bước 3:Thiết kế chương trình dăng ký đối tượng Friend với dịch vụ COS Naming

Ví dụ: Setup.Java

import org.omg.Corba.*;

import org.omg.CosNaming.*;

import org.omg.CosNaming.NamingContextPackage.*;

import java.util.Properties;

public class Setup{

public static void main(String args[]) throws Exception{

System.out.println("Corba Friend Object");

ORB orb=ORB.init(args,null);

Friend servant= new FriendServant();

orb.connect(servant);

org.omg.Corba.Object nameService=

orb.resolve_initial_references("NameService");

NamingContext nsContext=

NamingContextHelper.narrow(nameService);

NameComponent nc=new NameComponent("FriendObject","");

NameComponent path[]={nc};

nsContext.rebind(path,servant);

//Cho nhan yeu cau tu may khach

java.lang.Object obj=new java.lang.Object();

synchronized(obj){

obj.wait();

}

}

}

Như chúng ta đã thấy việ cài đặt và đăng ký đối tượng Corba không có gìđặc biệt.Nó hoàn toàn giống như những ví dụ trên Nhưng điểm khác biệt là trình khách mà ta sẽ viết sau đây không dùng lớp Friend.class để gọi đối tượng chủ.Trình khách sử dụng kỹ thuật reflect

Bước 4: Xây dựng trình khách

Ví dụ : Client.Java

import org.omg.Corba.*;

import org.omg.CosNaming.*;

import java.lang.reflect.*;

public class Client {

public static void main(String args[])throws Exception{

ORB orb = ORB.init(args,null);

org.omg.Corba.Object nameService=

orb.resolve_initial_references("NameService");

NamingContext nsContext=NamingContextHelper.narrow(nameService);

NamingComponent nc=new NameComponent("FriendObject","");

NameComponent path[]={nc};

//Chuyen tham chieu cua doi tuong Corba thanh doi tuong Java

java.lang.Object o=(java.lang.Object)nscontext.resolve(path);

//Truy tim xuat xu cua lop doi tuong

Class c=o.getClass();

//Dinh kieu phuong thuc cua tham so can goi

Class []parameterTypes=new Class[]{String.class};

//Truy tìm phương thức cần gọi

Method theMethod;

theMethod=c.getMethod("greeting",parametterType);

//Dinh doi so truyen vao phuong thuc can goi

java.lang.Object[] arguments=new jva.lang.Object[] {"Jerry"};

//Goi phuong thuc va nhan ket qua tra ve

String result=(String) theMethod.invoke(o,arguments);

System.out.println (result) ;

}

}

Bước 5: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

Kỹ thuật phản chiếu (reflect) là đặc trưng của riêng ngôn ngữ java. Corba được xây dựng với mục đích dùng cho đa ngôn ngữ nên bản thân Corba không thể chỉ dựa vào khả năng phản chiếu mà Java cung cấp. Corba cung cấp cho bạn cách gọi động các phương thức của một đối tượng Corba bất kỳ. Corba gọi khả năng này là “giao tiếp gọi động” (Dynamic Invocation Interface). Với kỹ thuật này trình khách client có thể yêu cầu trình môi giới ORB duyệt qua các phương thức mà đối tượng Corba nắm giữ. Truyền tham số và triệu gọi phươngthức mà không cần đến lớp tham chiếu tường minh của đối tượng. Ví dụ trên được viết bằng kỹ thuật reflect trong Java sẽ được viết lại theo phong cách của Corba như sau:

Ví dụ: ClientCorba.Java

import org.omg.Corba.*;

import org.omg.CosNaming.*;

public class ClientCorba{

public static void main(String args[])throws Exception{

ORB orb=ORB.init(args,null);

org.omg.Corba.Object nameService=

orb.resolve_initial_references("NameService");

NamingContext nsContext=NamingContextHelper.narrow(nameService);

NameComponent nc=new NamingComponent("FriendObject","");

NameComponent path[]={nc};

//Lay ve tham chieu tong quat cua doi tuong Corba

Org.omg.Corba.Object o=nsContext.resolve(path);

//Yeu cau Corba truy tìm và tra ve tham chieu cua phuong thuc greeting

trong doi tuong Corba

Org.omg.Corba.Request request=o._request("greeting”);

//Tao doi tuong truyen vao ham greeting

Request.add_in_arg().insert_string("Jerry");

//Dinh kieu tra ve cua phương thức greeting

Request.set_return_type(orb.get_primitive_tc(org.omg.Corba.TCKind.

tk_string));

//Trieu goi phuong thuc greeting

Request.invoke();

//Lay ket qua tra ve sua khi goi ham

String result=request.result().value().extract_string();

System.out.println(result);

}

}

Ở ví dụ trên,sau khi lấy về tham chiếu của đối tượng Corba bằng lệnh

Org.omg.Corba.Request request=o._request(“greeting”);

Biết rằng trong đối tượng Corba o vừa lấy về có chứa phương thức mang tên “greeting” ta yêu cầu o trả về tham chiếu của phương thức này như sau:

org.omg.Corba.request request=o._request(“greeting”);

Dựa vào đối tượng Request bạn có thể truyền đối số và gọi phương thức “greeting” một cách gián tiếp như sau:

//Tạo đối số kiểu chuỗi để truyền vào greeting

Request.add_in_arg().insert_string(“Jerry”);

//Định kiểu trả về của phương thức greeting

Request.set_retủn_type(ỏb.get_primitive_tc(org.omg.Corba.TCKind.tk_

string));

//Triệu gọi phương thức greeting

Request.invoke();

//Lấy kết quả trả về sau khi gọi hàm

String result=request.result().value().extract_string()

Invoke() dùng để triệu gọi phương thức mà đối tượng Request tham chiếu đến. Khi bạn triệu gọi phương thức, giá trị trả về sẽ được đối tượng Request quản lý. Bạn chỉ định kiểu dữ liệu trả về cho phương thức gọi bằng cách gọi set_return_type() của Request. Corba cung cấp cho bạn rất nhiều hằng định kiểu trả về như: TCKind.tk_string, TCKind.tk_float, TCKind.tk_char, TCKind_long…trả về kiểu chuỗi nên ta sử dụng TCKind.tk_string để định kiểu. Sau lời gọi invoke() bạn có thể gọi phương thức result()để nhận kết quả trả về. Biên dịch và chạy trình khách ClientCorba. Kết quả kết xuất hoàn toàn tương tự như ví dụ trên.

0