25/05/2018, 08:49

Cài đặt đối tượng phân tán

Khi bạn muốn tạo ra một sự vật từ xa thì bạn che mạt nạ cài đặt nền bằng cách truyền qua một giao diện. Vậy khi khách thu đựơc một tham chiếu đến đối tượng từ xa thì thực chất đó là một giao diện. Khi tạo ra một giao diện từ xa, thì ...

Khi bạn muốn tạo ra một sự vật từ xa thì bạn che mạt nạ cài đặt nền bằng cách truyền qua một giao diện. Vậy khi khách thu đựơc một tham chiếu đến đối tượng từ xa thì thực chất đó là một giao diện.

Khi tạo ra một giao diện từ xa, thì bạn phải tuân theo các hướng dẫn sau:

  1. Giao diện từ xa phải là một giao diện public, tức là khi tạo ra một giao diện từ xa ta phải thêm từ khoá public vào trước định nghĩa giao diện. Bằng không, khi bạn tham chiếu đến đối tượng từ xa bạn sẽ thu được một ngoại lệ
  2. Giao diện từ xa phải là giao diện được kế thừa từ giao diện Remote
  3. Mỗi phương pháp trong giao diện từ xa phải khai báo RemoteException trong mệnh đề throws bên bất cứ ngoại lệ nào khác, tức là tất cả các phương thức trong giao diện từ xa đều phải ném ra ngoại lệ RemoteException
  4. Nếu tham số truyền cho phương thức hoặc giá trị nhận về từ thức triệu gọi từ xa là một đối tượng thì đối tượng đó phải triển khai giao diện Remote hoặc giao diện Serializable

Thông thường bạn thường thấy một giao diện từ xa có cấu trúc như sau:

import java.rmi.*;

public interface RemoteInterface extends Remote{

[public] ReturnDataType method1([DataType arg1,][ DataType arg2,…] ) throws RemoteException;

[public] ReturnDataType method2() throws RemoteException;

}

Ví dụ 1-1: Sau đây là một giao diện từ xa đơn giản của ứng dụng HelloRMI

HelloRMI.java

import java.rmi.*;

public interface HelloRMI extends Remote{

public String sayHello() throws RemoteException;

}

Nhìn vào giao diện này ta thấy nó giống bất kỳ giao diện nào khác ngoại trừ nó được mở rộng từ giao diện Remote và tất cả các phương thức trong giao diện này đều phải nem ra ngoại lệ RemoteException, bạn hãy nhớ rằng tất cả các phương thức được khai báo trong giao diện sẽ tự động là public, thế nên trong giao diện trên bạn có thể bỏ từ khoá public khi khai báo phương thức sayHello.

Bạn tiến hành biên dịch javac HelloRMI.java bạn sẽ thu được tệp tin HelloRMI.class

Sau khi bạn tạo ra giao diện từ xa, công việc tiếp theo mà bạn cần phải làm là triển khai tất cả các phương thức trong giao diện từ xa.

Ví dụ 1-2: Sau đây là cài đặt của giao diện từ xa HelloRMI

HelloRMIImpl.java

import java.rmi.*;

public class HelloRMIImpl implements HelloRMI {

public String sayHello() throws RemoteException

{

return "Hello RMI";

}

}

Vấn đề đặt ra là làm thế nào để cài đặt đối tượng HelloRMI lên một máy (máy 2) và gọi phương thức sayHello() của HelloRMI từ máy khác (máy 1)? Như đã nêu ở trên ta không gọi được phương thức sayHello của HelloRMI một cách trực tiếp mà cần có thêm hai lớp trung gian là HelloRMIImpl_Stub và HelloRMIImpl_Skel. Dựa vào lớp HelloRMIImpl.class, trình biên dịch rmic.exe của Java sẽ giúp ta tạo ra hai lớp trung gian Stub và Skel. Bạn mở cửa sổ DOS – Prompt và gõ vào dòng lệnh

Rmic HelloRMIImpl.class

Kết quả bạn sẽ thu được hai tệp HelloRMIImpl_Stub.class và HelloRMIImpl_Skel.class

Bước tiếp theo sau khi bạn cài đặt giao diện từ xa là công việc đăng ký nó với trình rmiregistry theo mẫu sau:

Ví dụ 1-4: Ví dụ sau là chương trình đăng ký và cài đặt đới tượng HelloRMIImpl với trình chủ rmiregistry.

Setup.java

import java.rmi.server.*;

import java.rmi.*;

import java.net.*;

public class Setup {

public static void main(String[] args) {

// tạo ra một thể hiện của đối tượng từ xa

HelloRMI h=new HelloRMIImpl();

try {

// Khai báo đối tượng có khả năng triệu gọi từ xa

UnicastRemoteObject.exportObject(h);

// đăng ký nó với trình rmiregistry

Naming.bind("//localhost/hello”, h);

// có thể thay phương thức bind bởi phương thức rebind như sau:

// Naming.rebind("//localhost/hello”, h);

}

catch (MalformedURLException ex) {

}

catch (AlreadyBoundException ex) {

}

catch (RemoteException ex) {

}

}

}

Công việc đầu tiên bạn phải làm khi cài đặt đối tượng từ xa là tạo ra một thể hiện của đối tượng từ xa.

HelloRMI h=new HelloRMIImpl(); bạn có thể thay bằng dòng lệnh

HelloRMIImpl h=new HelloRMIImpl();

Tiếp theo bạn gọi phương thức tĩnh exportObject của lớp UnicastRemoteObject để máy ảo java biết đối tượng h (HelloRMI) là đối tượng có khả năng truy xuất từ xa.

UnicastRemoteObject.exportObject(h);

Lưu ý để sử dụng được lớp UnicastRemoteObject bạn phải khai báo import java.rmi.server.*; ở đầu chương trình

Bước cuối cùng là bạn đặt cho đối tượng h một cái tên gợi nhớ và đẵng ký tên này với bộ đăng ký rmiregistry. Phương thức tĩnh của lớp Naming sẽ thực hiện điều này

Naming.bind("[rmi:]//hostname[:port]/name”, h);

Phương thức bind có hai tham số: tham số thứ nhất là một chuỗi định vị URL, đối số thứ hai là bản thân đối tượng cần đăng ký

Chuỗi định vị URL có định dạng như sau:

[rmi:]//hostname[:port]/name

Trong đó:

  • mri là tên giao thức,đây là phần tuỳ chọn, mặc định giao thức là rmi nên bạn có thể bỏ qua.
  • Hostname là tên của máy chủ hoặc địa chỉ IP của máy chủ nơi đối tượng phân tán đang tồn tại.
  • Port là số hiệu cổng của chương trình rmiregistry, đây là tham số tuỳ chọn, nếu bỏ qua tham số này thì cổng mặc định là 1009
  • Name là tên gợi nhớ của đối tượng phân tán

Phương thức bind sẽ đi vào vòng lặp vô hạn chờ kết nối từ máy kách.

Các chương trình phía máy khách sẽ dựa vào chuỗi định vị URL mà ta đăng ký với trình rmiregistry để truy tìm tham chiếu đến đối cần dùng.

Bạn có thể khởi động bộ đăng ký rmiregistry này ở đâu? Bạn mở cửa sổ DOS-Prompt và cho chạy chương trình rmiregistry này từ dòng lệnh như sau:

0