RSS

RMI & CORBA – P2

06 Jan

II.RMI

1)TỒNG QUAN VỂ RMI

Trong một ứng dụng không phân tán của java, đoạn mã trong một đối tượng có thể gọi phương thức của một đối tượng khác và máy ảo Java phân giải địa chỉ và truyền tham số từ đối tượng gọi đến phương thức được gọi, ngoài ra nó cũng trả về các giá trị cho đối tượng gọi thực thi phương thức

Trong ứng dụng phân tán, mặc dù đoạn mã lập trình phương thức trông có vẻ giống như trong trường hợp ứng dụng không phân tán, nhưng là một cơ chế hoàn toàn khác nhau được dùng để móc những đối tượng này. Khi một đối tượng muốn gọi một phương thức, nó sẽ gọi một đối tượng bè bạn bên phía máy khách, đối tượng này sẽ đại diện cho đối tượng gọi phương thức bên phía máy chủ. Đối tượng này được gọi là stub

Stub sẽ gọi kiến trúc RMI bên phía máy khách và di chuyển dữ liệu qua mạng đến kiến trúc RMI trên máy chủ, đến lược nó sẽ gọi thực thi một đối tượng bè bạn bên phía máy chủ gọi là skeleton.

Đối tượng skeleton sẽ gọi phương thức của đối tượng thật sự bên phía máy chủ. Đến khi trả lại kết quả thì một cơ chế giống hệt như trên sẽ được gọi thực thi nhưng theo thứ tự ngược lại, khi đó kết quả trả về sẽ được truyền cho đối tượng skeleton trên máy chủ, và được đối tượng này truyền theo đường mạng sử dụng kiến trúc RMI, tiếp đến nó sẽ gọi đối tượng stub bên phía máy khách, và trả về giá trị cho đối tượng gọi phương thức

Cái hay của kiến trúc đối tượng phân tán RMI là người lập trình chỉ cần lập trình các lời gọi phương thức vì đối tượng được gọi đã hiện diện trong máy ảo Java của nó

2)Stub và skeletons

Stub và skeleton được phát sinh ra từ đối tượng gọi và đối tượng được gọi bằng cách sử dụng một công cụ biên dịch của RMI là rmic. Các trình đóng gói ứng dụng phải đảm bảo là các stubs phải được đóng gói kèm theo với các đoạn mã bên phía máy khách hay các tập tin JAR, và các skeleton phải đi kèm với các đoạn mã bên phía máy chủ hoặc các thư viện JAR

Các Stub có thể được tự động tải về từ máy chủ web khi có yêu cầu. Hình dưới đây minh họa luồng dữ liệu giữa stub và skeleton trong kiến trúc của RMI

RMIStubSkeleton

3)Xây dựng các đối tượng

Hầu như không có khác biệt giữa lập trình trên máy cục bộ và lập trình phân tán trong RMI. Lập trình phân tán chỉ yêu cầu một ít yêu cầu lập trình

Tất cả các lớp muốn có thể được triệu gọi từ xa thì phải có 2 phần: phần giao diện (interface) và phần cài đặt (implementation). Phần giao diện phải thừa kế từ một lớp của Java là lớp Remote. Phần cài đặt không những cài đặt phần giao diện mà còn phải thừa kế từ một lớp của Java là lớp UnicastRemoteObject

Thật sự có một mạng liên lạc tồn tại dưới cơ chế gọi phương thức từ xa, và mạng này có thể có lỗi hay bị ngắt kết nối hoàn toàn. Hoặc máy chủ có thể bị lỗi. Vì vậy bên máy khách có thể có vài lỗi mà nó phải xử lý trong lập trình phân tán. Những lỗi này xuất hiện dưới với dạng ngoại lệ RemoteException, vì thế tất cả phương thức trên đối tượng của máy chủ được thiết kế để được triệu gọi từ xa phải khai báo là nó sẽ tung ra ngoại lệ RemoteException. Mã bên phía máy người dùng nên xử lý những lỗi này khi nó xuất hiện

Dưới đây là một giao diện đơn giản cho một lớp truyền vào và lấy ra một String:

// Example.java

//

// Giao diện cho đối tượng triệu gọi từ xa

//

import java.rmi.*;

public interface Example extends Remote {

public void setString( String s ) throws RemoteException;

public String getString() throws RemoteException;

}

Và đây là phần cài đặt:

// ExampleServer.java

//

// Phần cài đặt đối tượng từ xa cho giao diện Example

//

import java.rmi.*;

import java.rmi.server.*;

public class ExampleServer extends UnicastRemoteObject implements Example {

private String stringState;

public ExampleServer() throws RemoteException{}

public void setString( String s ) throws RemoteException{

stringState = s;

}

public String getString() throws RemoteException{

return stringState;

}

}

Phần tiếp theo chúng ta sẽ tạo stub và skeleton cho lớp ExampleServer bằng cách sử dụng lệnh

rmic ExampleServer

4)RMI Registry

Chúng ta phải xác định được vị trí của đối tượng từ xa, RMI cung cấp một máy chủ chuyên quản lý tên là RMI Registry để thực hiện chức năng này

Một đối tượng có một tên (trong ví dụ này nó có tên là “Example”) và một vị trí của máy (trong ví dụ là “localhost”). Trong đoạn mã sau, chúng ta sẽ tạo một đối tượng ExampleServer và tạo một lối vào RMI Registry đặt trên máy cục bộ và đặt cho nó một cái tên là Example

Chúng ta sử dụng phương thức rebind() để tránh lỗi trong trường hợp tên này đã tồn tại trong RMI Registry, ngược lại chúng ta cũng có thể sử dụng phương thức bind(). Chúng ta chỉ cần chạy đoạn mã này một lần đến khi nào tiến trình của RMI Registry còn hoạt động. Thông tin trong registry không được lưu trữ xuống vĩnh viễn(persistent).

// Server.java

//

// Chương trình trên máy chủ tạo một đối tượng từ xa “Example” và đưa nó vào

// RMI registry

//

import java.io.*;

import java.rmi.*;

import java.rmi.server.*;

public class Server {

public static void main ( String[] args ) throws RemoteException, java.net.MalformedURLException {

//

// Create a new example object and enter it into the RMI registry

// located on “localhost” under the alias “Example”

ExampleServer es = new ExampleServer();

Naming.rebind( “rmi://localhost/Example”, es );

}

}

5)Xây dựng chương trình bên phía máy khách

Cuối cùng chúng ta xây dựng một chương trình bên phía máy khách để thực hiện lời gọi từ xa. Đầu tiên, chúng ta phải xác định được vị trí của đối tượng bên phía máy chủ, vì vậy chúng ta phải tìm đối tượng Example trong RMI Registry và gọi một phương thức để truyền vào một chuỗi và đọc ngược nó ra và cuối cùng là xuất nó ra màn hình

// ExampleClient.java

//

// Chương trình bên phía máy khác gọi đối tượng từ xa Example để truyền vào một //.

// chuỗi và đọc nó ra

import java.rmi.*;

public class ExampleClient {

public static void main ( String[] args ) {

try {

// Tìm đối tượng từ xa “Example” trong RMI registry

Example example = (Example) Naming.lookup( “Example” );

//

// Truyền vào một chuỗi và đọc nó ra trở lại rồi xuất ra màn hình

example.setString( “Success!” );

System.out.println( example.getString() );

} catch (Exception e) {

e.printStackTrace();

}

}

}

Để chạy ví dụ chúng ta phải khởi động RMI Registry lên, chạy chương trình bên phía máy chủ một lần, sau đó chúng ta có thể chạy chương trình bên phía người dùng

start rmiregistry

start java Server

java ExampleClient

Nếu thực hiện thành công bạn sẽ thấy kết quả là “Success” trên màn hình

6)Triển khai RMI trên 2 máy khác nhau

Chúng ta sẽ xem xét ứng dụng RMI được viết và chạy một chương trình trong một tiến trình, cùng một JVM và nó liên lạc với một tiến trình khác chạy trên cùng máy. Khi chúng ta tách rời chức năng của hai máy ra, chúng ta sẽ xem xét việc triển khai như thế nào

Nếu chúng ta muốn chạy ví dụ trên 2 máy khác nhau thì

•Bên phía máy khách cần có các lớp sau: Example.class, ExampleClient.class, ExampleServer_Stub.class

•Bên phía máy chủ cần có các lớp sau: ExampleServer.class, Server.class, Example.class, ExampleServer_Stub.class, ExampleServer_Skel.class

Reference

http://javavietnam.org and http://dbglory.wordpress.com

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