使用J2SE1.4開發CORBA程序(五)

最後是實現客戶端。如代碼7所示。客戶端完成以下任務:

n         創建和初始化ORB

n         使用通用名稱服務corbanameURL解析AddServant。使用該URL查找在本機上運行的名稱服務,然後運行在端口2900上並監聽請求。找到名稱服務後,它就會從名稱服務中找到對象AddServer

n         調用對象的addArrays方法並輸出結果。本例中客戶端每6秒調用一次addArrays方法。如果在客戶端下次調用請求前該服務器被停止了,那麼由於永久生命期策略客戶端將會自動重啓該服務器。

代碼示例7AddClient3.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( );

    }

  }

}

現在可以編譯AddServantAddServer3AddClient3類,還有那些由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>

本例中我們使orbdservertool運行在同一臺主機上。如果你想要在另一臺主機上運行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.out257.err的文件。這些文件記錄了服務的啓動和關閉時間,還有發生的所有錯誤信息。在本例中該子目錄就在c:/airthmetic下。

小結

上面的例子介紹瞭如何使用新定義的POA開發CORBA應用程序,以及如何開發暫時和永久服務端。

如果你有現成的使用BOA編寫的CORBA程序,那麼你就需要將它重寫成使用POA的,然後你的程序就可以在由不同開發商提供的ORB間使用了。

參考文獻

CORBA Programming with J2SE 1.4Qusay H. MahmoudMay 2002developers.sun.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章