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.
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);
}
}
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();