隨筆-109  評(píng)論-187  文章-25  trackbacks-0
          上篇文章講述了jacorb 的配置,本章講敘其應(yīng)用,隨后的幾篇文章會(huì)重點(diǎn)講述corba的開(kāi)發(fā)
           

          JACORB開(kāi)發(fā)以及corba的請(qǐng)求方式:

             JacORB的應(yīng)用開(kāi)發(fā)一般分為以下五步:

          1.IDL接口定義

          2.編譯IDL接口定義生成Java

          3.實(shí)現(xiàn)步驟2中生成的接口

          4.寫服務(wù)器啟動(dòng)類,并注冊(cè)到ORB

          5.寫客戶端去獲取服務(wù)對(duì)象引用

           

          本例子是采用JACORB里面的一個(gè)GRID的例子,從這里例子我們能看出CORBA開(kāi)發(fā)的一些基本步驟,猶豫本例子采用的都是JAVA開(kāi)發(fā)的,由于也受到JACORB的框架限制,并不能很好看出跨語(yǔ)言平臺(tái)以及如何做到分布式的開(kāi)發(fā),但是本例 2種基本的方式能夠展現(xiàn)出來(lái)corba兩中            調(diào)用方式:

             第一種方式:根據(jù)server生成的IDL以及IOR文件,交給客戶端,客戶端根據(jù)這IOR文件來(lái)定位server,然后根據(jù)IDL接口生成自己的調(diào)用代碼(本例中是JAVA,當(dāng)然也可以自己用別的語(yǔ)言來(lái)實(shí)現(xiàn))

             第二種方式:根據(jù)Naming Service 的方式來(lái)定位server,有點(diǎn)類似于JNDI的方式,有個(gè)Naming Server server端把一些服務(wù)注冊(cè)上去,clientnaming server來(lái)找這些服務(wù).

           

          以上是2種最基本的方式來(lái)實(shí)現(xiàn) CORBA的這2種調(diào)用方式,第一種方式雖然麻煩一點(diǎn),但是也是很有效的。本例子用JAVA實(shí)現(xiàn)的serverClient 充分的展示了這2種調(diào)用方式

           

           1.IDL接口定義

           

            全部Corba結(jié)果是從一個(gè)接口開(kāi)始的,因?yàn)?/span>Corba與語(yǔ)言無(wú)關(guān),所以它依靠一種接口定義語(yǔ)言來(lái)表達(dá)如何向?qū)崿F(xiàn)接口的服務(wù)發(fā)出請(qǐng)求以及得到應(yīng)答.

           這是Jacorb里面Grid的例子,IDL的詳細(xì)語(yǔ)法可以去OMG找些相關(guān)的資料來(lái)看,比較簡(jiǎn)單

          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

              // set the element [n,m] of the grid, to value:

              void set(in short n, in short m, in fixedT value);

              // return element [n,m] of the grid:

              fixedT get(in short n, in short m);

              exception MyException

              {

                  string why;

              };

              short opWithException() raises( MyException );

              };

          };

          };

          我們用這樣一個(gè)與任何語(yǔ)言無(wú)關(guān)的IDL文件將來(lái)生成一些與語(yǔ)言相關(guān)一些文件,這些文件里面定義了 包名,類名,方法名.

          2.編譯IDL接口定義生成Java

          根據(jù)下圖就可以看出來(lái)生成的文件哪些是server的那些client

           

           

          3.實(shí)現(xiàn)步驟2中生成的接口

          package demo.grid;

          /**

          * A very simple implementation of a 2-D grid

          */

          import demo.grid.MyServerPackage.MyException;

          public class gridImpl extends MyServerPOA

          {

          protected short height = 31;

          protected short width = 14;

          protected java.math.BigDecimal[][] mygrid;

          public gridImpl()

          {

          mygrid = new java.math.BigDecimal[height][width];

          for( short h = 0; h < height; h++ )

          {

          for( short w = 0; w < width; w++ )

          {

          mygrid[h][w] = new java.math.BigDecimal("0.21");

          }

          }

          }

          public java.math.BigDecimal get(short n, short m)

          {

          if( ( n <= height ) && ( m <= width ) )

          return mygrid[n][m];

          11

          else

          return new java.math.BigDecimal("0.01");

          }

          public short height()

          {

          return height;

          }

          public void set(short n, short m, java.math.BigDecimal value)

          {

          if( ( n <= height ) && ( m <= width ) )

          mygrid[n][m] = value;

          }

          public short width()

          {

          return width;

          }

          public short opWithException()

          throws demo.grid.MyServerPackage.MyException

          {

          throw new demo.grid.MyServerPackage.MyException("This is only

          a test exception,

          }

          }

          4.寫服務(wù)器啟動(dòng)類,并注冊(cè)到ORB

          MyServer接口來(lái)訪問(wèn)。以下是個(gè)類的源代碼:

          package demo.grid;

          import java.io.*;

          import org.omg.CosNaming.*;

          public class Server

          {

          ////// public static void main( String[] args )

          {

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

          try

          {

          org.omg.PortableServer.POA poa =

          org.omg.PortableServer.POAHelper.narrow(

          orb.resolve_initial_references("RootPOA"));

          poa.the_POAManager().activate();

          org.omg.CORBA.Object o = poa.servant_to_reference(new

          gridImpl());

          if( args.length == 1 )

          {

          // write the object reference to args[0]

          PrintWriter ps = new PrintWriter(

          new FileOutputStream(

          new File( args[0] )));

          ps.println( orb.object_to_string( o ) );

          ps.close();

          }

          else

          {

          // register with the naming service

          NamingContextExt nc =

          NamingContextExtHelper.narrow(

          orb.resolve_initial_references("NameService"));

          nc.bind( nc.to_name("grid.example"), o);

          12

          }

          }

          catch ( Exception e )

          {

          e.printStackTrace();

          }

          orb.run();

          }

          }

          5.寫客戶端去獲取服務(wù)對(duì)象引用

          package demo.grid;

          import org.omg.CosNaming.*;

          public class Client

          {

          public static void main(String args[])

          {

          try

          {

          MyServer grid;

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

          if(args.length==1 )

          {

          // args[0] is an IOR-string

          grid =

          MyServerHelper.narrow(orb.string_to_object(args[0]));

          }

          else

          {

          NamingContextExt nc =

          NamingContextExtHelper.narrow(

          orb.resolve_initial_references("NameService"));

          grid = MyServerHelper.narrow(

          nc.resolve(nc.to_name("grid.example")));

          }

          short x = grid.height();

          System.out.println("Height = " + x);

          short y = grid.width();

          System.out.println("Width = " + y);

          x -= 1;

          y -= 1;

          13

          System.out.println("Old value at (" + x + "," + y +"): " +

          grid.get( x,y));

          System.out.println("Setting (" + x + "," + y +") to 470.11");

          grid.set( x, y, new java.math.BigDecimal("470.11"));

          System.out.println("New value at (" + x + "," + y +"): " +

          grid.get( x,y));

          try

          {

          grid.opWithException();

          }

          catch (jacorb.demo.grid.MyServerPackage.MyException ex)

          {

          System.out.println("MyException, reason: " + ex.why);

          }

          }

          catch (Exception e)

          {

          e.printStackTrace();

          }

          }

          }

          JACORB的調(diào)用方式分為 2種方式

          (一)IOR定位調(diào)用方式

           首先我們展示的是IOR定位調(diào)用方式,需要server把生成的IOR文件交給client

            首先運(yùn)行server 把生成的ior文件保存到一個(gè)文件中:

          jaco demo.grid.Server d://test/NS_Ref

          打開(kāi)d://test/NS_Ref可以看到如下內(nèi)容:

          IOR:000000000000001B49444C3A64656D6F2F677269642F4D795365727665723A312E300000000000020000000000000070000102000000000E6C6F6F636B7977616E672D30310012980000001C5374616E64617264496D706C4E616D652F00151F2C4C294C3C011139000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C0000000000000001000000010000001C00000000000100010000000105010001000101090000000105010001

           

           

          其實(shí)這個(gè)內(nèi)容我們可以用JACORB提供command可以反解析的

          Dior –f d://test/NS_Ref

           

          ------IOR components-----

          TypeId  :       IDL:demo/grid/MyServer:1.0

          TAG_INTERNET_IOP Profiles:

                  Profile Id:     IIOP Version :  1.2

                  Host    :       loockywang-01

                  Port    :       4760

                  Object key (URL):      StandardImplName/%00%15%1F,L)L%3C%01%119

                  Object key (hex):    0x53 74 61 6E 64 61 72 64 49 6D 70 6C 4E 61 6D 65 2

          F 00 15 1F 2C 4C 29 4C 3C 01 11 39

                  -- Found 2 Tagged Components--

                  #0: TAG_ORB_TYPE

                          Type: 1245790976 (JacORB)

                  #1: TAG_CODE_SETS

                          ForChar native code set Id: ISO 8859-1

                          Char Conversion Code Sets: UTF-8

                          ForWChar native code set Id: UTF-16

                          WChar Conversion Code Sets: UTF-8

           

          Components in MULTIPLE_COMPONENTS profile: 1

                  #0: TAG_CODE_SETS

                          ForChar native code set Id: ISO 8859-1

                          Char Conversion Code Sets: UTF-8

                          ForWChar native code set Id: UTF-16

                          WChar Conversion Code Sets: UTF-8

           

           

          從這段內(nèi)容里面我們可以看到HOST PORT等信息也就是說(shuō)client有辦法定位到server的位置以及服務(wù)了

           IOR的內(nèi)容 作為參數(shù)來(lái)運(yùn)行 client程序

          C:\Documents and Settings\jpwang>jaco demo.grid.Client IOR:000000000000001B49444

          C3A64656D6F2F677269642F4D795365727665723A312E300000000000020000000000000070000102000000000E6C6F6F636B7977616E672D303100135C0000001B5374616E64617264496D706C4E616D652F00151F2D0C241517473600000000020000000000000008000000004A414300000000010000001C00000000000100010000000105010001000101090000000105010001000000010000002C00000

          00000000001000000010000001C00000000000100010000000105010001000101090000000105010001

          得到如下運(yùn)行結(jié)果

          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 :-)

          done.

           

           

           

           

          (二)Naming Service的調(diào)用方式

           

          1:?jiǎn)?dòng)ns

          Naming service的調(diào)用一定要啟動(dòng)naming server,在這里JACORB提供一個(gè)command ns

           

          只要配置文件寫的都對(duì),只需要啟動(dòng)NS就可以了

           

          >ns 回車

           

          2:啟動(dòng)server

          jaco demo.grid.Server

          3:監(jiān)控你的namingserver 通過(guò)命令nmg

          或者通過(guò)命令lsns 得到如下結(jié)果.

          C:\Documents and Settings\jpwang>lsns

          [ configuration jacorb loaded from file D:\work\nj\JACORB\etc\jacorb.properties

          ]

             grid.example

           

           

          4:運(yùn)行client

          C:\Documents and Settings\jpwang>jaco demo.grid.Client

          得到如下結(jié)果

          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 :-)

          done.

           

          posted on 2007-11-22 10:41 小小程序程序員混口飯吃 閱讀(8324) 評(píng)論(2)  編輯  收藏 所屬分類: java

          評(píng)論:
          # re: 用JACORB開(kāi)發(fā)corba應(yīng)用 2008-03-25 21:22 | hongguoyuan
          使用jacorb運(yùn)行它自帶的小例子grid,出現(xiàn)如下錯(cuò)誤。敢問(wèn)樓主知道如何解決否?不勝感謝!!



          [ configuration jacorb loaded from file F:\workspace\jaco2\etc\jacorb.properties ]
          int orb ok!
          [jacorb.orb] INFO :
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          JacORB V 2.2, www.jacorb.org
          (C) Gerald Brose, XTRADYNE Technologies/FU Berlin, 7-May-2004
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          [jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1 IORIs
          [jacorb.poa] INFO : oid:
          00 15 2B 2D 40 0A 29 2E 01 41 11 ..+-@.)..A.
          object is activated
          [jacorb.orb.giop] INFO : ClientConnectionManager: created new conn to target 202.112.157.79:10021
          [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
          [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
          [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
          [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
          [jacorb.iiop.conn] INFO : Retrying to connect to 202.112.157.79:10021
          org.omg.CORBA.TRANSIENT: Retries exceeded, couldn't reconnect to 202.112.157.79:10021 vmcid: 0x0 minor code: 0 completed: No
          at org.jacorb.orb.iiop.ClientIIOPConnection.connect(Unknown Source)
          at org.jacorb.orb.giop.GIOPConnection.write(Unknown Source)
          at org.jacorb.orb.CDROutputStream.write(Unknown Source)
          at org.jacorb.orb.giop.ServiceContextTransportingOutputStream.write_to(Unknown Source)
          at org.jacorb.orb.giop.GIOPConnection.sendMessage(Unknown Source)
          at org.jacorb.orb.giop.GIOPConnection.sendRequest(Unknown Source)
          at org.jacorb.orb.giop.ClientConnection.sendRequest(Unknown Source)
          at org.jacorb.orb.giop.ClientConnection.sendRequest(Unknown Source)
          at org.jacorb.orb.Delegate.invoke_internal(Unknown Source)
          at org.jacorb.orb.Delegate.invoke(Unknown Source)
          at org.jacorb.orb.Delegate.is_a(Unknown Source)
          at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)
          at org.omg.CosNaming.NamingContextExtHelper.narrow(NamingContextExtHelper.java:73)
          at demo.grid.SimpleServer.main(SimpleServer.java:48)

            回復(fù)  更多評(píng)論
            
          # re: 用JACORB開(kāi)發(fā)corba應(yīng)用[未登錄](méi) 2014-07-30 16:01 | jayden
          請(qǐng)問(wèn)下這個(gè)怎么做動(dòng)態(tài)調(diào)用,能不能做?如果這樣的例子求一個(gè)307106941@qq.com  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 城市| 民权县| 东台市| 石屏县| 龙陵县| 平安县| 邳州市| 平乐县| 德清县| 甘德县| 金平| 中宁县| 清河县| 郎溪县| 嘉定区| 古丈县| 临朐县| 敦化市| 赣榆县| 南投县| 当雄县| 玉林市| 瓦房店市| 佛坪县| 寻乌县| 贡嘎县| 塔河县| 长顺县| 星子县| 桃园市| 蒙城县| 重庆市| 绥化市| 蓬溪县| 同心县| 新昌县| 江山市| 老河口市| 兴安县| 桃江县| 平远县|