RSS

RMI & CORBA – P3

06 Jan

III.CORBA

1)Tổng quan vể CORBA

CORBA là Common Object Request Broker Architecture

Xem chi tiết tại: wikipedia.org

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 localhostKế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

References:

http://javavietnam.org ; http://dbglory.wordpress.com ; http://wikipedia.org

posted by hotdream1990

 
Leave a comment

Posted by on January 6, 2011 in CORBA, Java, zZ_IT_Define_Zz

 

Tags: ,

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