歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用Java進行CORBA編程-JacORB-入門

使用Java進行CORBA編程-JacORB-入門

日期:2017/3/1 10:40:19   编辑:Linux編程

http://www.jacorb.org/download.html下載JacORB3.0Beta。
下面開發一個簡單的應用。

首先需要定義IDL文件。例如:

[cpp]
  1. module learning {
  2. module corba {
  3. module bookstore {
  4. struct Author {
  5. string firstName;
  6. string lastName;
  7. };
  8. struct Book {
  9. string name;
  10. double price;
  11. };
  12. typedef sequence<Book> BookList;
  13. struct SearchCondition {
  14. string name;
  15. any value;
  16. };
  17. exception NotFound{};
  18. interface BookQuery {
  19. void search(in SearchCondition condition, out BookList bookList)
  20. raises (NotFound);
  21. };
  22. interface ClientCallback;
  23. interface CallbackServer {
  24. void registerCallback(in ClientCallback cc);
  25. void callback_notifyMsg(in string msg);
  26. };
  27. interface ClientCallback {
  28. void notifyMsg(in string msg);
  29. };
  30. };
  31. };
  32. };

在Eclipse裡面,可以通過下面的XML配置執行ANT Build編譯IDL文件。

[html]
  1. <project name="common-demo" default="idl">
  2. <property name="idl.dir" value="." />
  3. <property name="gen.dir" value="../../.." />
  4. <property name="resources.dir" value="resources" />
  5. <property name="jacorb.dir" value="../../../../../jacorb-3.0beta1" />
  6. <path id="jacorb.classpath" >
  7. <fileset dir="${jacorb.dir}/lib">
  8. <include name="*.jar" />
  9. </fileset>
  10. </path>
  11. <target name="idl.taskdef">
  12. <taskdef name="jacidl" classname="org.jacorb.idl.JacIDL" classpathref="jacorb.classpath"/>
  13. </target>
  14. <target name="idl" depends="idl.taskdef">
  15. <jacidl srcdir="${idl.dir}" destdir="${gen.dir}" includes="*.idl" helpercompat="jacorb"
  16. includepath="${jacorb.dir}/idl/omg" />
  17. </target>
  18. </project>

對於struct,生成3個文件。以Author為例,
Author.java
AuthorHelper.java -> 用來從Any對象中extract出Author對象/向Any對象中insert Author對象
AuthorHolder.java -> 用於輸出參數

如果定義了sequence,還會得到*ListHelper.java和*ListHolder.java文件。

對於interface,除了上面的3個文件,還生成3個文件。以BookQuery為例:
BookQueryOperations.java ->定義我們的interface
BookQueryPOA.java ->BookQuery服務的提供者(Servant),我們的代碼需要繼承這個類
BookQueryPOATie.java ->如果我們的服務實現類沒有沒有繼承BookQueryPOA類,直接實現BookQueryOperations接口,需要通過BookQueryPOATie來轉換為一個Servant對象。

接下來可以分別進行Server端和Client端的編碼。

Server
Server端的一般步驟如下:
1)新建1個類,繼承自*POA類。在其中實現所有提供的接口。
接下來在Server端的main方法中,
2)調用ORB.init()這個靜態方法,初始化ORB並得到一個ORB對象。
3)在ORB對象上調用resolve_initial_references("RootPOA"))方法,獲得root POA,然後激活它。或者創建1個新的POA,激活這個POA。
4) 在ORB對象上調用resolve_initial_references("NameService"))方法,獲得NameService的引用。
5)創建我們的服務提供對象,向NameService注冊,注冊時提供一個服務名。
6)調用ORB對象的run方法。

Client
Client端的一般步驟如下:
在Client端的main方法中,
1)調用ORB.init()這個靜態方法,初始化ORB並得到一個ORB對象。
2) 在ORB對象上調用resolve_initial_references("NameService"))方法,獲得NameService的引用。
3)提供服務名,向NameService查詢並得到服務提供者的代理。
4)調用服務。

Any對象
對於Any對象,首先使用ORB對象的create_any方法生成1個Any對象,然後可以使用*Helper類的extract/insert方法抽取/插入一個對象。
可以使用Any對象的type方法獲得這個Any對象中存放的對象的類型。

Copyright © Linux教程網 All Rights Reserved