Tài liệu: Corba và trình môi giới VISIBROKER

Tài liệu
Khoa CNTT ĐHSP KT Hưng Yên

Tóm tắt nội dung

-
Corba và trình môi giới VISIBROKER

Nội dung

Tổ chức OMG chỉ đưa ra các đặc tả tổng quát để xây dựng mô hình đối tượng phân tán để triệu gọi lẫn nhau. Nhưng trên thực tế thì để ứng dụng và thực thi thì các đối tượng đó lại không thể giao tiếp với nhau. Chính vì lẽ đó mà họ đã đưa ra trình môi giới trung gian để các đối tượng có thể giao tiếp với nhau một cách dễ dàng. Trình môi giới trung gian đó có tên gọi là ORB. Nhờ trình môi giới trung gian này mà các đối tượng Corba có thể trao đổi được với nhau theo giao thức IIOP.

Visibroker là một trình môi giới trung gian do hãng Borland cài đặt, nó hoàn toàn miễn phí và hỗ trợ java. Bạncó thể download miễn phí tạ địa chỉ: http://www.borland.com/visibroker.

Giới thiệu Visibroker của Borland

Borland là hãng phát triển công cụ lập trình rất nổi tiếng. Bạn đã từng gặp Borland qua các sản phẩm của ngôn ngữ lập trình như: C++, Pascal, Jbuider… Hơn ai hết chính Borland cũng đã tìm tòi và đưa ra cách tích hợp các ngôn ngữ với nhau. Và Corba ra đời cũng vì lẽ đó. Visibroker là một giải pháp dành cho những người lập trình theo hướng Corba. Visibroker là trình môi giới trung gian ORBcos khả năng giao tiếp đươc với các loại ngôn ngữ lập trình khác nhau.

Khi cài đặt đối tượng Corba trong Visibroker, về nguyên tắc không khác gì khi cài đặt đối tượng Corba. Bạn có thể tham khảo tại địa chỉ: http://www.borland.com/visibroker.

Xây dựng đối tượng chủ Corba

Cách xây dựng đối tượng chủ Corba sẽ dược làm sảng tỏ qua ví dụ mnh hoạ giao dịch trong ngân hàng thông qua đối tượng Corba. Đối tượng Account dùng để chứa thong tin của khách hàng. Còn đối tượng AccountManager dùng để quản lý và cấp phát đối tượng Account cho những khách hang nào muốn mở tài khoản.

Ví dụ : Đặc tả đối tượng Corba bằng ngôn ngữ idl

module Bank{

interface Account {

float balance();

};

interface AccountManage{

Account open (in String name);

};

Để thực thi được VD10.1 bạn cần tạo ra một thư mục C:\Corba\BankApp. Sau đó lưu tập tin Bank.idl này vào thư mục vừa tạo. Biên dịch Blank.idl sang Java như sau:

C:\Corba\BlankApp > Idl2Java Blank.idl

Chương trình idl2java.exe nằm trong thư mục cài đặt Visibroker\Bin. Kết quả bạn sẽ thấy tạo ra các tập tin sau trong thư mục con Bank:

Đối tượng Account:

Acount.Java

AccountHelper.Java

AccountHolder.Java

AccountPOA.Java

AccountOperation.Java

AccountPOATile.Java

Và đối tượng AccountManager

AccountManager.Java

AccountManagerHelper.Java

AccountManagerHolder.Java

AccountManagerOperations.Java

AccountManagerPOA.Java

AccountManagerPOATile.Java

Tổng quát tương tự bạn thu được các tập tin sau:

.Java

_Helper.Java

_Holder.Java

_Operations.Java

Đặc tả Corba mới nhất đưa ra giao tiếp khả chuyển (Portable) cho nên thay vì tạo ra lớp _ImplBase. Java thì ta thu được lớp _POA.java. Còn lớp _POATile.Java đóng vai trò là lớp trung gian giao tiếp giữa đối tượng và ORB.

Để cài đặt cho đối tượng Corba trong Visibroker bạn thừa kế lớp _POA như Ví dụ 8 sau:

Ví dụ: AccountImpl.Java:

// cai dat doi tuong Account

public class AccountImpl extends Bank.AccountPOA {

private float_balance;

public AccountImpl(fload balance){

_balance=balance;

public float balance(){

return _balance;

}

}

}

Đối tượng Account cung cấp cho ta phương thức balnace() trả về cân đối tài khoản khách hàng.Account đực tạo ra bởi phương thức open() của AccountManager như ví dụ 9 sau:

Ví dụ: AccountManagerImpl.Java

import org.omg.PortableServer.*;

import java.until.*;

public class AccountManagerImpl extends Bank.AccountManagerPOA

{

//bang chua cac tai khoan can quan ly

private Dictionary _accounts = new Hashtable();

//doi tuong tao so ngau nhien

private Random _random = new Random();

//phuong thuc nay duoc trieu goi de mo tai khoan cho khach hang mang ten name

public Bank.Account open(String name) {

//xem tai khoan da co hay chua

Bank.Account account = (Bank.Account) _accounts.get(name);

//Neu chua thi tao tai khoan moi

if(account == null) {

//Tao so tien ban dau cho tai khoan

float balance = Math.abs(_random.nextInt()) % 100000;

//tao doi tuong tai khoan moi

AccountImpl accountServant = new AccountImpl(balance);

try {

//chuyen doi tuong ve kieu Account

account = Bank.AccountHelper.narrow(

_default_POA().servant_to_reference(accountServant));

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

//tai khaon duoc tao thanh cong

System.out.println("Created " + name + "'s account: " + account);

//luu tai hoan vao danh sach

_accounts.put(name, account);

}

//tra ve tai khoan cho khach hang

return account;

}

}

Để hiểu rõ hơn chúng ta cùng đi xây dựng chương trình Server và Client dùng để đăng ký đối tượng AccountManager với trình ORB của Visibroker được thực hiện như hai ví dụ dưới đây:

Ví dụ: Server.Java

import org.omg.PortableServer.*;

public class Server {

public static void main(String[] args) {

try {

//khoi tao trinh ORB

org.omg.Corba.ORB orb = org.omg.Corba.ORB.init(args,null);

//Lay ve tham chieu goc cua doi tuong ORB

POA rootPOA = POAHelper.narrow(

orb.resolve_initial_references("RootPOA"));

//Tao chinh sach quy dinh doi tuong hoat dong

org.omg.Corba.Policy[] policies = { rootPOA.create_lifespan_policy(

LifespanPolicyValue.PERSISTENT)

};

//Tao doi tuong MyPOA moi them vao doi tuong POA goc

POA myPOA = rootPOA.create_POA( "bank_agent_poa",

rootPOA.the_POAManager(), policies );

//Tao doi tuong phuc vu servant

AccountManagerImpl managerServant = new AccountManagerImpl();

//Chi dinh ten cho doi tuong

byte[] managerId = "BankManager".getBytes();

//Kich hoat doi tuong chua trong POA

myPOA.activate_object_with_id(managerId,managerServant);

//Kich hoat bo quan ly POA

rootPOA.the_POAManager().activate();

System.out.println( myPOA.servant_to_reference(managerServant) +

" is ready.");

// Cho yeu cau tu may khach

orb.run();

}

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

}

}

Chương trình xây dựng cho phía Client

Ví dụ: Client.Java

public class Client {

public static void main(String[] args) {

//Khoi dong trinh trung gian ORB

org.omg.Corba.ORB orb = org.omg.Corba.ORB.init(args,null);

//Dinh ten cua doi tuong Corba can goi

byte[] managerId = "BankManager".getBytes();

//Truy tim tham chieu cua doi tuong

Bank.AccountManager manager =

Bank.AccountManagerHelper.bind(orb,

"/bank_agent_poa",managerId);

//Su dung doi so args[] lam ten tai khoan.Neu args[0] khong co ten tai khoan thi duoc dat la khongco

String name = args.length > 0 ? args[0] : "khongco";

//Yeu cau doi tuong AccountManager mo tai khoan

Bank.Account account = manager.open(name);

//Lay ve so can doi tai khoan

float balance = account.balance();

//Ket qua

System.out.println("The balance in " + name

+ "'s account is $" + balance);

}

}

Biên dịch và triệu gọi đối tượng Corba trong Visibroker

Để biên dịch chương trình chúng ta vừa xây dựng ở trên ta lưu tất cả vào một thư mục C:\corba\BlankApp. Visibroker sử dụng trình vbjc.exe để biên dịch và trình vbj.exe để thực thi chương trình.

Để biên dịch mã nguồn:

C:\corba\BlankApp > vbjc *.Java

Khởi động trình Visibroker ORB mang tên Visibroker Smart Agent. Vào thư mục C:\Visibroker\bin\ và đánh lệnh sau

C:\Visibroker\bin\osagent.exe

Trình Smart Agent của Visibroker chịu trách nhiệm quản lý tên đăng ký của đối tượng Corba. Thực hiện kết nối giữa Smart Agent trên máy chủ và máy khách ta có:

Chạy chương trình đăng AccountManager như sau:

C:\corba\BlankApp >vbj Server

Chạy trình khách:

C:\corba\BlankApp > vbj Client

Và kết quả trả ra màn hình là :

The balance in khongco’s account is $779.56

Các đặc tả mới của Corba và Visibroker

Các đặc tả mới nhất của Corba là muốn xây dựng mô hình khả chuyển Portable cho các khái niệm bằng POA (Portable Object Adaptor)

POA là đối tượng chịu trách nhiệm quản lý và kích hoạt các đối tượng theo yêu cầu của trình khách. ORB thì cung cấp cho ta rất nhiều POA. Mỗi POA đều chứa các POA con được sinh ra từ POA gốc gọi là ROOT POA. Mỗi POA chứa một bảng danh sách (Active Object Map) cho biết đối tượng nào đang trong trạng thái phục vụ. Đối tượng POA được quản lý theo định danh ID chứa trong danh sách kích hoạt. Xem hình dưới:

Cơ chế quản lý đối tượng Corba theo đặc tả mới

Khi trình khách yêu cầu gọi một đối tượng từ POA, lớp POA sẽ kiểm tra xem định danh ID của đối tượng cần gọi đã có trong bảng kích hoạt hay chưa. Nếu có rồi POA sẽ trả về tham chiếu của đối tượng trình khách triệu gọi. Còn trường hợp chưa có thì POA sẽ yêu cầu bộ quản ly đối tượng (Servant Manager) kiến tạo đối tượng để POA quản lý.

Các chính sách (policy) đăng ký phía máy chủ

Trình tự của quá trình đăng ký máy chủ AccountManager diễn ra như sau:

Để sử dụng lời gọi đến POA chúng ta cần liên kết với gói PortableServer bằng lệnh:

import org.omg.PortableServer.*;

Công việc đầu tiên trong trình tự của quá trình đăng ký máy chủ là ta tham chiếu đến thư mục gốc cũng như chúng ta đã làm với context của Corba.

//Lay ve tham chieu goc cua doi tuong ContextPOA

POA rootPOA = POAHelper.narrow (

Orb.resolve_initial_referentces (“RootPOA) ) ;

//Tao doi tuong My POA mơi tham gia vao doi tuong POA goc

POA myPOA=rootPOA..create_POA (“ blank_agent_poa”,

rootPOA .the_POAManager() , policies) ;

Mỗi POA cần một chính sách để hoạt động (như thời hạn cho phép tồn tại của đối tượng…..). Các chính sách này được tạo ra nư sau:

//Tao chinh sách cac doi tuong hoat dong trong POA

org.omg.Corba.Policy [] policies = { rootPOA.create_lifespan_polyci

(LifespanPolicyValue.RERSISTENT) ; } ;

/* Doi tuong AccountManager duoc tao ra va dua vao trang thai cua

POA nhu sau */

//Tao doi tuong phuc vu servant

AccountManagerImpl managerSevant=

new AccoutManagerImpl ();

//Chi dinh ten ID cho doi tuong

byte [] managerID = “BlankManager” .getByte();

//Kich hoat doi tuong trong POA

myPOA.activate_object_with_id (managerId,managerServant);

Khi bạn kích hoạt một đối tượng trong POA thì đối tượng ấy chưa thực sự hoạt động.Muốn đối tượng ấy có thê triệu gọi được trình khách thì ta cần kích hoạt các POA như sau:

//Kich hoatbo quan ly POA

rootPOA.the_POAManager () .activate);

//Yeu cau Orb lang nghe loi trieu goi tu may khach

orb.run();

Gọi đối tượng máy chủ phía máy khách

Quá trình triệu gọi đối tượng chủ (sau khi đã đưng ký với trình Visibroker Smart Agent như trên) từ phía máy khách bạn chỉ cần khởi động trình ORB như sau:

orm.omg.Corba.ORB orb=org.omg.Corba.ORB.init(args,null);

Tiếp theo là lấy về các lớp trợ giúp do (idl2java sinh ra) và nhận về tham chiếu của đối tượng chủ như sau:

byte [] managerID = BlankManager.getByte();

//Truy tim tham chieu cua doi tuong

Bank.AccountManager manager= Bank.AccountManagerHelper.bind

(orb,”/bank_agent_poa”,managerId);

Lệnh bind() ở đây tương tự như lệnh Naming.lookup() của RMI hay context.resolve() của dịch vụ Cosnaming.

Phát triển Hệ thống phân tán



Nguồn: voer.edu.vn/m/corba-va-trinh-moi-gioi-visibroker/da4e6dde


Chưa có phản hồi
Bạn vui lòng Đăng nhập để bình luận