Lập trình CORBA trong Java

Một phần của tài liệu dữ liệu nguồn warehouese trong cơ sở thiết kế data (Trang 37)

1.4.2.1. Giới thiệu về CORBA và IDL

CORBA4 là một chuẩn công nghiệp, được đề xuất bởi OMG5, OMG là đại diện cho trên 700 nhà cung cấp và phát triển phần mềm thành lập năm 1989, hỗ trợ cho lập trình các đối tượng phân tán, cho phép gọi phương thức từ xa. CORBA được thiết kế từ tầng thấp nhất trở lên để hỗ trợ mạng diện rộng, hệ điều hành và các loại ngôn ngữ lập trình.

CORBA là một giải pháp tốt hơn RMI trong lập trình phân tán bởi vì ứng dụng RMI chỉ thực thi được trên nền Java. Ứng dụng CORBA cho phép thực hiện lời gọi các đối tượng chạy trong máy ảo Java. CORBA không phải là một ngôn ngữ lập trình nhưng nó đặc tả làm thế nào để các đối tượng tương tác được với nhau, do dó ứng dụng CORBA không bị hạn chế bởi ngôn ngữ lập trình. Các dịch vụ CORBA phía server và ứng dụng CORBA phía client có thể được viết bằng nhiều loại ngôn ngữ khác nhau.

CORBA không phải là một ngôn ngữ lập trình, do đó nó đã giới thiệu một ngôn ngữ mới IDL6. Các dịch vụ CORBA được mô tả bằng một lược đồ, đó là mẫu để tạo nhanh các phương thức của đối tượng trong ngôn ngữ IDL. Các ngôn ngữ

4 Common Object Brocker Architecture

5 Object Management Group

như Java có hỗ trợ CORBA có thể cài đặt lược đồ IDL. IDL là một ngôn ngữ trung gian, có thể ánh xạ một lược đồ IDL sang bất kỳ ngôn ngữ lập trình nào hỗ trợ IDL (luận văn này chỉ đề cập xây dựng chương trình ứng dụng CORBA bằng ngôn ngữ lập trình Java).

Hiện tại OMG đặc tả ngôn ngữ IDL có thể ánh xạ sang các ngôn ngữ lập trình sau:  C  C++  Smalltalk  COBOL  Ada  Java 1.4.2.2. Kiến trúc CORBA

CORBA được hình thành từ sự lắp ghép các đối tượng và các ứng dụng phần mềm hoạt động cùng với nhau. Một lược đồ viết bằng ngôn ngữ IDL mô tả các đối tượng được gọi từ xa, thành phần môi giới yêu cầu đối tượng ORB7 thực hiện giao tiếp giữa đối tượng ở xa và ứng dụng khách [8]. ORB xử lý các yêu cầu dịch vụ của một đối tượng cũng như gửi trả các đáp ứng cho đối tượng. Hình 1.9 cho thấy các clients và servant tương tác với nhau thông qua ORB.

Hình 1.9. Đối tượng cục bộ hoạt động như proxy đối với đối tượng ở xa Các đối tượng được xem như cục bộ và gọi các phương thức của chúng như các đối tượng bình thường. ORB hoạt động như một đối tượng trung gian giữa client và servant, còn giao tiếp giữa client và servant qua mạng Internet được thực hiện thông qua giao thức IIOP8.

Hình 1.10. Giao tiếp qua mạng Internet sử dụng IIOP

IIOP là một mô đun phần mềm đã được xây dựng sẵn, nếu phần mềm sử dụng IIOP như là một cơ chế giao vận thì nó sẽ có đầy đủ sự mạnh mẽ cũng như bị hạn chế của giao thức TCP/IP. Phần mềm CORBA sẽ bị ảnh hưởng do các hạn chế của mạng bởi các Applets cũng như Firewalls.

8 Internet Inter-ORB Protocol

1. Các dịch vụ CORBA

Ứng dụng CORBA mô tả các dịch vụ phần mềm bằng một lược đồ và thực hiện bằng một phục vụ. Servant như là một phần đặc biệt của phần mềm đã đăng ký với một dịch vụ tìm kiếm để phần mềm CORBA khác có thể định vị và truy nhập các dịch vụ của nó. Một máy chủ CORBA sẽ tạo ra một servant CORBA, sau đó nó chịu trách nhiệm tạo ra một ORB cho servant và đăng ký dịch vụ để các client có thể truy nhập được dịch vụ.

Hình 1.11. Các server đăng ký với dịch vụ tên CORBA

2. Các client CORBA

Các client CORBA không cần đăng ký với một dịch vụ tên nhưng chúng cần sử dụng dịch vụ tên để tìm kiếm các servant. Các servant có thể được định vị trên cùng một máy hoặc có thể di chuyển nhưng dịch vụ tên sẽ hỗ trợ cho client định vị chúng. CORBA được thiết kế rất mạnh mẽ, khi servant di chuyển từ máy này đến một máy khác các client vẫn định vị được servant nhờ vào dịch vụ tên, trong lần sau việc tìm kiếm định vị servant, sẽ được tham chiếu đến máy mới, điều này giống như RMI nhưng khả năng dung thứ lỗi và độ linh hoạt của CORBA tốt hơn RMI rất nhiều nhờ vào mã hóa cứng trong mã nguồn hoặc các file cấu hình và sự cho phép của các nhà quản trị mạng để phân tán các dịch vụ mạng sao cho cân bằng tải.

Hình 1.12. Client dùng dịch vụ tên CORBA để định vị server CORBA

1.4.2.3. Ngôn ngữ IDL 1. Giới thiệu

IDL định nghĩa nhiều cấu trúc ngôn ngữ, cho phép mô tả các đối tượng bằng lược đồ đa dạng, phong phú.

2. Các kiểu dữ liệu IDL

IDL định nghĩa một tập các kiểu dữ liệu nguyên thủy như các kiểu số và text. IDL còn có khả năng tạo ra các kiểu dữ liệu có cấu trúc như mảng và các cấu trúc dữ liệu.

Kiểu dữ liệu Java Kiểu dữ liệu IDL void void boolean boolean char wchar Byte octet Short short Integer long

Long long long

Float float

Double double

String string/wstring

Hình 1.13. Ánh xạ các kiểu dữ liệu của Java sang các kiểu dữ liệu IDL

3. Các giao diện IDL

Giao diện mô tả một đối tượng từ xa bao gồm các phương thức công khai của đối tượng, các biến thành viên và các hằng số. Một định nghĩa giao diện được mở đầu bằng từ khóa interface, dưới đây là một ví dụ về định nghĩa giao diện (adsbygoogle = window.adsbygoogle || []).push({});

interface UserAccount {

float getBalance();

void setBalance(in float amount); };

4. Các mô đun IDL

Mô đun IDL là một nhóm các giao diện có liên quan chặt chẽ với nhau. Các mô đun được xem như là khái niệm gói trong Java. Các lớp có liên quan với nhau được nhóm theo loại.

5. Các thuộc tính IDL

Các thuộc tính của giao diện có thể được truy nhập bởi các client ở xa, do đó các thuộc tính cần được bảo vệ trong trường hợp không cho phép client ở xa thay đổi giá trị của nó bằng cách sử dụng từ khóa readonly trong khai báo thuộc tính. Sau đây là ví dụ khai báo thuộc tính :

interface UserAccount {

// Thuộc tính balance không được bảo vệ và giá trị có thể bị thay đổi

attribute float balance;

// Thuộc tính accountid chỉ cho phép đọc và không thể thay đổi giá trị từ client

readonly attribute long long accountid; };

6. Các thao tác IDL

IDL có sử dụng các thuộc tính nhưng phần quan trọng của lược đồ IDL là các thao tác. Các thao tác có thể được gọi từ xa để thực hiện. Các thao tác thực chất là các hàm có thể nhận giá trị đầu vào bằng các tham số và có thể trả lại một giá trị sau khi hàm thực hiện. IDL đặc tả ba kiểu tham số được sử dụng trong một thao tác

 in - Chỉ sử dụng cho tham số đầu vào và không thay đổi được giá trị.  out - Sử dụng cho tham số đầu ra có thể thay đổi được giá trị.

 inout - Kiểu tham số này là sự kết hợp của cả hai kiểu tham số trên.

Sau đây là ví dụ giao diện có ba hàm đơn giản. Hai hàm có tham số vào. Mỗi hàm cũng đặc tả giá trị trả về, trong ví dụ này là kiểu số thực float.

interface UserBalance {

float getBalance();

float addBalance(in float amount);

};

7. Xử lý ngoại lệ IDL

Xử lý ngoại lệ trong CORBA là một cách tốt để nhận biết các tình huống bất thường. Xử lý ngoại lệ trong CORBA so với Java không có gì khác biệt nhiều. Các ngoại lệ trong CORBA có thể không phải là các lớp con từ lớp ngoại lệ chung, điều này trái ngược trong Java, với các lớp ngoại lệ chung thông thường định danh có thể được kích hoạt nhưng thật ra lớp con cụ thể thực hiện ngoại lệ sẽ được kích hoạt. Ví dụ như ngoại lệ java.net.Socket có thể được kích hoạt khi sử dụng lớp Socket nhưng thật ra phân lớp thực hiện ngoại lệ của nó được kích hoạt như

java.net.ConnectException hoặc java.net.NoRouterToHostException. IDL cho phép định nghĩa nhiều kiểu ngoại lệ trong một lược đồ IDL. Một thao tác IDL có thể được phép kích hoạt nhiều kiểu ngoại lệ, cách này giải quyết dễ dàng hơn kiểu ngoại lệ phân lớp. Ví dụ sau minh họa hai ngoại lệ IDL được kích hoạt bởi một thao tác. Từ khóa raise được sử dụng để xác định phương thức kích hoạt ngoại lệ. module BankingSystem { exception AccountInactive { string reason; }; exception AccountOverdrawn { string reason; }; interface BankAccount {

double withdrawMoney(in double amount) raises (AccountInactive, AccountOverdrawn);

... };

1.4.2.4. Từ IDL đến Java

Chúng ta đã xem xét cú pháp cơ bản của ngôn ngữ định nghĩa giao diện. Phần tiếp theo sẽ viết một dịch vụ CORBA mô tả bằng lược đồ IDL và thực hiện bằng ngôn ngữ lập trình Java, để thử nghiệm cần viết thêm một client CORBA truy nhập dịch vụ CORBA. Ví dụ được trình bầy ở đây gọi là "distributed lightbulb service"[8].

1. Lược đồ ví dụ

Lược đồ IDL mô tả cho dịch vụ lightbulb được viết như sau, hãy ghi lại (adsbygoogle = window.adsbygoogle || []).push({});

bằng một tệp text có tên là LightBulb.idl

exception BulbBrokenException {

};

interface LightBulb {

void on () raises (BulbBrokenException); void off();

boolean isOn() raises (BulbBrokenException); };

2. Ánh xạ lược đồ IDL sang Java

Lược đồ IDL được ánh xạ sang Java bằng trình biên dịch dlj.exe, đi kèm với bộ JDK phiên bản 1.3. Giả sử đã có tệp LightBulb.idl, ta thực hiện biên dịch trong chế độ dòng lệnh như sau :

idlj -fall LightBulb.idl

Một chương trình CORBA có hai mô đun cho phía client và server, để ánh xạ riêng mô đun phía client sang Java sử dụng tham số -fclient của bộ biên dịch idlj, để ánh xạ riêng mô đun phía server sang Java sử dụng tham số -fserver của bộ biên dịch idlj, trong ví dụ trên sử dụng tham số -fall, tức là ánh xạ đồng thời cả hai mô đun cho phía client và server trong chương trình CORBA sang Java. Ví dụ này cần viết mã lệnh cho mô đun chương trình phía server và ghi lại trong tệp văn bản có tên là LightBulbServant.java, tương tự cần viết mã lệnh cho mô

đun chương trình phía client và ghi lại trong tệp văn bản có tên là LightBulbClient.java.

3. Lắp ghép các mô đun với nhau

Đến đây chúng ta đã hoàn thành tạo ra các mô đun chương trình cho cả hai phía client và server. Công việc cuối cùng là chạy cả hai mô đun để thử nghiệm giao tiếp từ xa giữa các đối tượng CORBA, điều này được thực hiện qua những bước sau :

1. Biên dịch các mô đun mã lệnh phía client và server cùng với tất cả các file phụ trợ được sinh ra bởi trình biên dịch idlj.exe. Nếu tất cả các file mã nguồn đặt trong cùng một thư mục chỉ cần thực hiện câu lệnh biên dịch của Java đơn giản như sau :

javac *.java

2. Khởi động trình dịch vụ tên CORBA, đây là một ứng dụng đi kèm trong bộ

JDK phiên bản 1.3 có tên là tnameserv.exe. Đây là một ứng dụng chạy

nền không có giao diện đồ họa. Dịch vụ này được khởi động giống như chạy một ứng dụng trên Windows trong chế độ dòng lệnh. Dịch vụ này lắng nghe yêu cầu từ phía client trên cổng 900.

3. Chạy mô đun server CORBA trong chế độ dòng lệnh như sau : java LightBulbServant

Nếu nhận được thông báo ngoại lệ org.omg.CORBA.COMM_FAILURE, có

nghĩa là ứng dụng CORBA phía server không thể tìm thấy phục vụ tên, cần phải kiểm tra lại xem tnameserv còn chạy không.

4. Chạy mô đun client CORBA trong chế độ dòng lệnh như sau : java LightBulbClient

Ứng dụng client sẽ tìm kiếm dịch vụ lightbulb thích hợp từ dịch vụ tên CORBA. Trên màn hình hiển thị thông báo "Looking for lightbulb", sau

đó là "Found lightbulb". Nếu điều này không xảy ra thì rất có thể là tnameserv hoặc ứng dụng server CORBA chưa chạy. Bây giờ ứng dụng client sẽ thực hiện vòng lặp để bật hoặc tắt bóng đèn (bulb) cho đến khi nó thoát khỏi vòng lặp.

Một phần của tài liệu dữ liệu nguồn warehouese trong cơ sở thiết kế data (Trang 37)