RMI & CORBA


III.CORBA
1)Tổng quan vể CORBA
Như đã đề cập ở trước thì CORBA định nghĩa nhiều dịch vụ, một trong những dịch vụ đó thực hiện chức năng tương tự như RMI, nhưng CORBA họat động với nhiều ngôn ngữ lập trình khác nhau và không chỉ với nền Java
CORBA được định nghĩa bởi một liên kết bao gồm 800 công ty thành viên, được gọi là Nhóm Quản Lý Đối Tượng (Object Management Group – OMG) 
Nói chung thì CORBA định nghĩa 2 thứ:
•Thực thể mà cho phép liên lạc giữa 2 tiến trình được gọi là 1 môi giới yêu cầu đối tượng (Object Request Broker – ORB)
•Một giao thức được ORB dùng để liên lạc giữa nhiều tiến trình, được gọi là IIOP (Internet Interoperability Protocol)
Nền của Java chứa 1 CORBA ORB. CORBA dùng cùng kỹ thuật stub/skeleton như RMI, nhưng không giống như RMI, CORBA phát sinh stub và skeleton từ một mô tả giao diện độc lập với ngôn ngữ được gọi là Ngôn Ngữ Mô Tả Giao Diện (Interface Description Language – IDL) thay vì mã nguồn của ngôn ngữ
IDL xác định tên phương thức, cũng như tham số gọi và trả về theo một kiểu ngôn ngữ trung lập

2)Tổng quan về Java IDL và RMI-IIOP
Java IDL và RMI-IIOP cung cấp 2 cách sử dụng đoạn mã Java bên phía máy khách với một đối tượng CORBA trên máy chủ
Với Java IDL thì các bước phát triển bắt đầu bằng định nghĩa giao diện từ xa bằng IDL, sau đó sẽ biên dịch IDL ra một ngôn ngữ đích bên phía máy chủ, tiếp đến là viếts đối tượng từ xa trên máy chủ sử dụng ngôn ngữ đó và triển khai từng phần
Vì không có RMI Registry trong môi trường của CORBA nên Dich Vụ Tên CORBA(CORBA Naming Service – COSNaming) cung cấp chức năng tìm kiếm vị trí đối tượng bên phía máy chủ
Với RMI-IIOP, stub và skeleton được phát sinh ngay từ định nghĩa đối tượng Java. Thay vì sử dụng giao thức trong RMI để liên lạc giữa 2 tiến trình, RMI-IIOP sử dụng giao thức CORBA IIOP để nó có thể gọi các đối tượng không được viết bằng ngôn ngữ Java. Các bước phát triển bắt đầu với cài đặt một lớp phát sinh bằng IDL trong ngôn ngữ Java. Lớp này được biên dịch với rmic dùng cớ hiệu –iiop –d và một lớp bên phía máy chủ sử dụng COSNaming, truy cập Giao Diện Thư Mục và Tên Trong Java (Java Naming and Directory Interface – JNDI)

3)Viết IDL
Chúng ta sẽ xem xét một ví dụ sử dụng CORBA. Đầu tiên chúng ta định nghĩa IDL cho đối tượng từ xa:
interface ExampleCORBA {
attribute string s;
};
Bây giờ chúng ta có thể biên dịch IDL dùng lệnh idlj. Tham số -fall phát sinh mã cả 2 phía máy khách và máy chủ
idlj -fall ExampleCORBA.idl
Sau khi biên dịch IDL, sẽ phát sinh một số tập tin sau:
•_ExampleCORBAStub.java là mã stub.
•ExampleCORBA.java là giao diện từ xa..
•ExampleCORBAHolder.java là mã hỗ trợ.
•ExampleCORBAHelper.java là mã hỗ trợ.
•ExampleCORBAOperations.java là mã hỗ trợ.
•ExampleCORBAPOA.java là mã skeleton và là lớp cha chúng ta thừa kế khi cài đặt mã bến phía máy chủ.

4)Viết đối tượng gọi từ xa
Tiếp đến chúng ta sẽ cài đặt lớp bên phía máy chủ được gọi là Servant và thừa kế từ lớp gốc phát sinh khi dịch IDL:

// ExampleCORBAServant.java
//
// The remote implementation for ExampleCORBAPOA
//
import org.omg.CORBA.*;

public class ExampleCORBAServant extends ExampleCORBAPOA {
private String stringState;
private ORB orb;

public void setORB( ORB o ) {
orb = o;
}

public String s() {
return stringState;
}

public void s( String s ) {
stringState = s;
}
}

5)Chương trình bên phía máy chủ
Tiếp đến chúng ta cài đặt mã bên phía máy chủ, để thực hiện việc khởi tạo đối tượng và đăng ký máy chủ tên:

// CORBAServer.java
//
// Server to make a new “Example” remote object and put a reference to
// it in the name service
//
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

public class CORBAServer {

public static void main ( String[] args ) {
try {
//
// Initialize the ORB
ORB orb = ORB.init( args, null );
POA rootpoa =
POAHelper.narrow( orb.resolve_initial_references(“RootPOA”));
rootpoa.the_POAManager().activate();
//
// Create a new remote Example object, set the ORB in it
// enter it into the name server
ExampleCORBAServant e = new ExampleCORBAServant();
e.setORB(orb);
//
// Make a reference to the object
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(e);
ExampleCORBA eRef = ExampleCORBAHelper.narrow(ref);
//
// Find the name service
org.omg.CORBA.Object oRef =
orb.resolve_initial_references(“NameService”);
NamingContextExt ncRef = NamingContextExtHelper.narrow( oRef );
//
// Enter the reference into the name service
String name = “Example”;
NameComponent path[] = ncRef.to_name( name );
ncRef.rebind(path, eRef);
//
// Wait and listen for requests
orb.run();

} catch (Exception e) { e.printStackTrace(); }
}
}

6)Chương trình bên phía máy khách
Cuối cùng chúng ta tạo ra một chương trình bên phía máy khách để thực hiện lới gọi phương thức từ xa:

// ExampleCORBAClient.java
//
// CORBA client for calling remote “Example” object
//
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

public class ExampleCORBAClient {

public static void main ( String[] args ) {
try {
//
// Initialize the ORB
ORB orb = ORB.init( args, null );
//
// Find the nameserver and downcast it from
// Object to NamingContext
org.omg.CORBA.Object o =
orb.resolve_initial_references( “NameService” );
NamingContext ns = NamingContextHelper.narrow(o);
//
// Find the “Example” alias in the root path and downcast it to
// ExampleCORBA
NameComponent nc = new NameComponent( “Example”, “”);
NameComponent path[] = {nc};
o = ns.resolve( path );
ExampleCORBA example = ExampleCORBAHelper.narrow( o );
//
// Call the Example remote object to set the string and read and
// print it
example.s( “CORBA Success!” );
System.out.println( example.s() );

} catch (Exception e) { e.printStackTrace(); }
}
}

7)Chạy ứng dụng CORBA
Để thực thi đoạn mã ví dụ, chúng ta phải khởi động RMI Registry, chạy đoạn mã bên phía máy chủ một lần, sau đó chúng ta có thể chạy chương trình khách:
start tnameserv
start java CORBAServer
java ExampleCORBAClient -ORBInitialHost localhost
Kết quả xuất ra màn hình là “CORBA Success!”

IV.TỔNG KẾT
Bạn đã trông thấy cả RMI và CORBA thực hiện cùng một chức năng là chương trình bên phía máy khách gọi phương thức của một đối tượng nằm bên phía máy chủ. Tuy nhiên làm thế nào để biết khi nào chọn RMI hay CORBA. Nếu bạn sử dụng nền Java ở cả 2 môi trường đầu cuối trong ứng dụng phân tán thì nên chọn RMI vì lập trình và mô hình triển khai đơn giản. Nếu bạn cần có một chương trình Java nói chuyện với một đối tượng không được viết bằng ngôn ngữ Java và nằm trên máy chủ, khi đó bạn nên chọn CORBA

Theo bai viet cua MinhKiller dien dan javavietnam.org

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s