1. 下載安裝Jacorb2.1
下載JacORB_2_1-compact.zip(已經編譯的版本),解壓縮到磁碟上,例如 E:/JacORB .
然後, 為了在調試時可以找到有關包和jacorb.properties設定檔,需要在系統內容變數中設定 classpath=.;E:/JacORB/idl.jar;E:/JacORB/jacorb.jar;E:/JacORB/classes; 另外,為了方便使用ant和命令列工具,在path中加入E:/JacORB/bin
修改E:/JacORB/bin 中的idl.bat(Linux下為idl)檔案,加入執行參數
@echo off
java -Djava.endorsed.dirs="e:/JacORB/lib" -classpath "e:/JacORB/lib/idl.jar;e:/JacORB/lib/logkit-1.2.jar;%CLASSPATH%" org.jacorb.idl.parser %*
接著,把E:/JacORB/etc目錄下的jacorb_properties.template複製到E:/JacORB/classes目錄下,並更名為jacorb.properties
在Corba中命名服務是非常重要的, 編輯jacorb.properties檔案,設定其中的 ORBInitRef.NameService=file:/E:/NS_Ref(這裡是樣本,當然可以為任何httpURL或者其他路徑),這個NS_Ref檔案會在啟動命名服務時產生.該設定檔其餘部分保留預設值即可.
2. 測試命名服務(NS,Naming Service)是否可以正常啟動
在dos視窗下輸入
ns E:/NS_Ref
如果出現下面的輸出說明已經正常啟動
[configuration loaded from classpath resource file:/E:/SSS/WEB-INF/classes/jacorb.properties]
JacORB V 2.1, www.jacorb.org
(C) Gerald Brose, XTRADYNE Technologies/FU Berlin, 16-Feb-2004
[jacorb.naming] INFO : NS up
如果沒有任何輸出,可能是由於你的jacorb.properties檔案沒有放到classpath所在的目錄下。
如果沒有正確啟動NS,運行下面的demo時會出現下面的異常
[jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1 IORIs
....
[jacorb.giop] INFO : ClientConnectionManager: created new conn to target 192.168.4.161:4089
[jacorb] ERROR : java.net.ConnectException: Connection refused: connect
3. idl編譯DEMO下的grid例子
觀察正確啟動NS後,DOS視窗轉到demo/grid目錄下執行 ant (如果ant沒有安裝則不會編譯)
E:/JacORB/demo/grid > ant
這樣會進行idl編譯server.idl檔案,在 E:/JacORB/demo/grid/generated下產生corba所需的源檔案
同時,ant會編譯所有的java源檔案,E:/JacORB/classes下面產生 .class檔案
4 運行grid例子,本例實現了一個簡單的服務.
4.1 首先參考第2步驗證是否ns 已經正常啟動.
4.2 啟動grid server
在dos視窗中執行(在 E:/JacORB/ 目錄下)
jaco demo.grid.Server
或者
jaco demo.grid.TieServer
正常時輸出:
[configuration loaded from classpath resource file:/E:/SSS/WEB-INF/classes/jacorb.properties]
JacORB V 2.1, www.jacorb.org
(C) Gerald Brose, XTRADYNE Technologies/FU Berlin, 16-Feb-2004
[jacorb.poa] INFO : oid:
00 11 48 40 02 10 1F 00 01 1E 04 ..H@.......
object is activated
這時在ns輸出視窗可以看到:
[jacorb.naming] INFO : Bound name: grid.example
另外,可以通過Jbuilder等IDE工具建立一個工程來運行demo.grid.Server,須指定vm參數-Djava.endorsed.dirs="E:/JacORB/lib" (在JBuilder中Runtime Configuration裡設定),結果一致.
4.3 啟動grid client端
jaco demo.grid.Client
輸出結果:
Height = 31
Width = 14
Old value at (30,13): 0.21
Setting (30,13) to 470.11
New value at (30,13): 470.11
MyException, reason: This is only a test exception, no harm done :-)
看到這個結果說明已經成功運行了grid例子.
5. 對照源碼,下面我們將簡單分析Grid例子:
JacORB的應用開發一般分為以下五步:
1.寫IDL介面定義
2.編譯IDL介面定義產生Java類
3.實現步驟2中產生的介面
4.寫伺服器啟動類,並註冊到ORB
5.寫用戶端去擷取服務物件引用
5.1 首先編寫server.idl檔案
關於編寫IDL參考doc/ProgrammingGuide.pdf文檔
// grid.idl
// IDL defintion of a 2-D grid:
module demo
{
module grid
{
interface MyServer
{
typedef fixed <5,2> fixedT;
readonly attribute short height; // height of the grid
readonly attribute short width; // width of the grid
void set(in short n, in short m, in fixedT value);
fixedT get(in short n, in short m);
exception MyException
{
string why;
};
short opWithException() raises( MyException );
};
};
};
5.2 利用工具 bin/idl.bat來編譯server.idl
idl -d ../.. server.idl
5.3 實現介面
public class gridImpl extends MyServerPOA
填寫建構函式,以及介面等方法,如:
public gridImpl()
public java.math.BigDecimal get(short n, short m)
public void set(short n, short m, java.math.BigDecimal value)
5.4 編寫伺服器
這一步要寫一個類來調用gridImpl類,並將其註冊到POA,這樣遠程對象才能通過
MyServer介面來訪問它。
1)初始化orb對象。
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
2)使用POAHelper來執行個體化為POA的引用。
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
3)啟用該對象,否則還處於“保持狀態,”無法處理任何請求。
poa.the_POAManager().activate();
4)通過POA將一個Java對象轉化成一個CORBA對象。
org.omg.CORBA.Object o = poa.servant_to_reference(new gridImpl());
5)使nc綁定該對象的引用(這一過程通過命名伺服器來完成),注意使對象的名稱作為bind()的參數
NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
nc.bind( nc.to_name("grid.example"), o);
5.5 編寫用戶端調用服務程式
1) 建立orb對象
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
2) 用戶端通過命名伺服器擷取一個"grid"服務的引用
NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
grid = MyServerHelper.narrow(nc.resolve(nc.to_name("grid.example")));
3) 使用grid對象進行我們的計算。