最後是實現客戶端。如代碼7所示。客戶端完成以下任務:
n 創建和初始化ORB。
n 使用通用名稱服務corbaname的URL解析AddServant。使用該URL查找在本機上運行的名稱服務,然後運行在端口2900上並監聽請求。找到名稱服務後,它就會從名稱服務中找到對象AddServer。
n 調用對象的addArrays方法並輸出結果。本例中客戶端每6秒調用一次addArrays方法。如果在客戶端下次調用請求前該服務器被停止了,那麼由於永久生命期策略客戶端將會自動重啓該服務器。
代碼示例7:AddClient3.java
import ArithApp.*;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
import org.omg.CORBA.ORB;
import org.omg.CORBA.OBJ_ADAPTER;
import org.omg.CosNaming.NamingContext;
import org.omg.CosNaming.NamingContextHelper;
import org.omg.CosNaming.NameComponent;
import org.omg.PortableServer.POA;
public class AddClient3 {
public static void main(String args[]) {
try{
// create and initialize the ORB
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object obj = orb.string_to_object(
"corbaname::localhost:2900#AddServer");
Add impl = AddHelper.narrow(obj);
// the arrays to be added
int a[] = {6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
int b[] = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
// the result will be saved in this new array
ArithApp.AddPackage.arrayHolder c =
new ArithApp.AddPackage.arrayHolder();
while(true) {
System.out.println("Calling
the persistent AddServer3..");
impl.addArrays(a, b, c);
// print the new array
System.out.println("The sum of the two arrays is: ");
for(int i=0;i<ArithApp.Add.SIZE;i++) {
System.out.println(c.value[i]);
}
System.out.println("...will
call the server again in a few seconds....");
System.out.println("...if the
server is down, it will be automatically restarted...");
Thread.sleep(6000);
}
} catch ( Exception e ) {
System.err.println( "Exception in AddClient3..." + e );
e.printStackTrace( );
}
}
}
現在可以編譯AddServant、AddServer3、AddClient3類,還有那些由idlj編譯器生成的框架文件。可以使用javac編譯器進行編譯:
prompt> javac *.java ArithApp/*.java
運行該程序需以下步驟:
1.啓動orbd名稱服務:
prompt> orbd -ORBInitialPort 2900
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
上面命令就說明你想要orbd服務運行在2900端口上。需要由命令行參數-ORBInitialPort指定。
2.啓動AddServer3服務端。
要在ORBD中註冊永久服務,需要使用命令servertool啓動該服務器,servertool是個命令行程序,供開發者註冊、取消、啓動和關閉永久服務。
可以用如下命令啓動servertool(注意一定要在orbd服務使用的端口號上啓動纔可正確運行它):
prompt> servertool -ORBInitialPort 2900
你可以看見servertool的命令行界面如下:
servertool>
本例中我們使orbd和servertool運行在同一臺主機上。如果你想要在另一臺主機上運行servertool,那麼你需要使用命令行參數-ORBInitialHost指明運行orbd服務的主機。
現在可以使用register命令註冊AddServer3服務。你需要指定服務名稱、程序名稱和該實現代碼存放的路徑。如圖所示:
正如你所看見的,servertool註冊了該服務,而且爲它分配了一個唯一的ID號(本例中是257),該ID號可以用於今後的內部服務管理。如果你註冊了一個已存在的服務,那麼ID號將返回0。
敲入help命令就可以看見servertool中所有命令的列表。如圖所示。
3.啓動AddClient3客戶端:
prompt> java AddClient3 -ORBInitialPort 2900
你可以看見客戶端輸出了兩數組的相加和。
爲了要展示永久服務器的特性,我們現在關閉該服務。如圖所示。
首先我們列出當前所有的已註冊服務,找到我們編寫的服務的ID號,然後使用shutdown命令關閉它。
即使該服務已經被關閉了,但你仍可以觀察到客戶端控制檯每6秒就輸出數組相加結果。這是因爲該服務是個永久服務,所以即使服務器被停止了仍會在客戶請求時自動重啓該服務。當然這些對客戶端來說都是透明的。
我們還可以使用listactive命令列出當前的活動服務清單:
orbd保存了服務器和有關於它們狀態的所有信息。當你運行orbd服務時,它就會在它的啓動目錄下創建一個子目錄。子目錄的名稱默認是orb.db。該子目錄包含了已註冊服務的信息以及日誌文件。如果你看了子目錄orb.db/logs下的文件,你就會發現諸如名爲257.out和257.err的文件。這些文件記錄了服務的啓動和關閉時間,還有發生的所有錯誤信息。在本例中該子目錄就在c:/airthmetic下。
小結
上面的例子介紹瞭如何使用新定義的POA開發CORBA應用程序,以及如何開發暫時和永久服務端。
如果你有現成的使用BOA編寫的CORBA程序,那麼你就需要將它重寫成使用POA的,然後你的程序就可以在由不同開發商提供的ORB間使用了。
參考文獻
CORBA Programming with J2SE 1.4,Qusay H. Mahmoud,May 2002,developers.sun.com