JaCORB安裝指南



JacORB的應用開發一般分爲以下五步:
    1.IDL接口定義編譯IDL

2.接口定義生成Java

3.實現步驟2中生成的接口

4.寫服務器啓動類,並註冊到ORB

5.寫客戶端去獲取服務對象引用

下載安裝Jacorb2.2.4

1)           http://www.jacorb.org/download.html下載JacORB 2.2.4,解壓縮到磁盤上,例如C:\JacORB

2)           在系統環境變量中設置 

classpath=.;C:\JacORB\lib\idl.jar;

C:\JacORB\lib\jacorb.jar;

C:\JacORB\lib\classes; 

 另外,爲了方便使用ant和命令行工具,path中加入C:\JacORB\bin

3)           接着,C:\JacORB\etc目錄下的jacorb_properties.template複製到C:\JacORB\classes目錄下,並更名爲jacorb.properties

4)           配置命名服務編輯jacorb.properties文件

設置其中的 ORBInitRef.NameService=file:/ D:/JacORB/NS_Ref,這個NS_Ref文件會在啓動命名服務時生成.該配置文件其餘部分保留默認值即可.

測試命名服務(NS,Naming Service)是否可以正常啓動

1)          C:\JacORB\bin目錄下找到文件jac.bat.tpl,更名爲jac.bat

2)           dos窗口下輸入   ns  NS_Ref
    
如果出現下面的輸出說明已經正常啓動

[jacorb.orb.print_ver] INFO

        JacORB V 2.3.0, www.jacorb.org
        <C>  The JacORBproject 17-Feb_2007

 [jacorb.orb] INFO :Property”jacorb.hashtable_class” is set to:java.util.Hashtable

……

……

 [jacorb.naming] INFO : NS up

[jacorb.orb] INFO : ORB run

 如果沒有任何輸出,可能是由於你的jacorb.properties文件沒有放到classpath所在的目錄下。

 

public static void main( String [] args )
 {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
  env.put(Context.PROVIDER_URL, "localhost:1099");
  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
  try
  {
   Context ctx = new InitialContext(env);
   Object obj = ctx.lookup( "HelloWorld" );
   HelloWorldHome home =(HelloWorldHome)javax.rmi.PortableRemoteObject.narrow(
obj, HelloWorldHome.class );
   HelloWorld helloWorld = home.create();
   System.out.println( helloWorld.hello());
   helloWorld.remove();
  }
  catch ( Exception e )
  {
   e.printStackTrace();
   System.out.println( "Exception: " + e.getMessage() );
  }
 }

 

 

 

要體現CORBA技術的運作,就從這個helloworld級的CORBA開始,用Java寫

1. 接口定義 (Hello.idl)
Hello.idl
module HelloApp
{
interface Hello
{
string sayHello(in string message);
};
};

裝了Java就自帶了工具idlj(jdk1.3.0_01以上版本,之前版本的是idltojava或idl2java),爲接口定義文件生成客戶端存根和服務器框架。具體操作如下:
idlj -oldImplBase -fall Hello.idl

編譯後將在 HelloApp 子目錄中形成以下六個文件:
●_HelloImplBase.java
該抽象類是一個服務器 skeleton,它可爲服務器提供基本的 CORBA 功能。它實現 Hello.java 接口。服務器類 HelloServant 擴展 _HelloImplBase。
● _HelloStub.java
該類是客戶機 stub,可爲客戶機提供 CORBA 功能。它實現 Hello.java 接口。

●Hello.java
該接口含有 IDL 接口的 Java 版本。Hello.java 接口擴展 org.omg.CORBA.Object 並提供標準的 CORBA 對象功能。

●HelloHelper.java
這是一個終態類,可以提供輔助功能,特別是提供將 CORBA 對象引用轉換爲適當類型所需的 narrow() 方法。

●HelloHolder.java
這是一個終態類,其中含有 Hello 類型的公有實例成員。它可爲“out” “inout” 變量提供操作。CORBA 有這些變量,但不容易映射爲 Java 的語義。
●HelloOperations.java
這是一個接口類,其中含有方法 sayHello()

要完成該應用程序,只需在文件 HelloServer.java HelloClient.java 中提供服務器和客戶機的實現即可。


2. 接口實現(HelloImpl.java
HelloImpl.javaHello IDL 接口的實現;每個Hello實例都由一個HelloImpl實例來實現。HelloImpl_HelloImplBase的子類,_HelloImplBase是由 idlj編譯器從示例 IDL 中生成的。


import HelloApp.*;
public class HelloImpl extends _HelloImplBase {
/*
構造函數 */
public HelloImpl() {
super();
}
/*
實現接口聲明方法
sayHello */
public String sayHello(String message) {
System.out.println("
我在CORBA的服務器端,客戶端正在調用'sayHello'方法。
");
System.out.println("Hello " + message);
return message;
}
}

3. 服務器端程序(HelloServer.java
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloServer {
public static void main(String args[]) {
try {
/*
創建和初始化 ORB */
ORB orb = ORB.init(args, null);
System.out.println("
開始
ORB Server ...");
/*
創建一個實例並將其向 ORB 註冊
*/
HelloImpl helloImpl = new HelloImpl();
orb.connect(helloImpl);
System.out.println("
將實例註冊到
ORB ");
/*
獲取根命名上下文
*/
org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
/*
綁定命名中的對象引用
*/
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = { nc };
ncRef.rebind(path, helloImpl);
/*
等待來自客戶機的調用
*/
java.lang.Object sync = new java.lang.Object();
synchronized (sync) {
sync.wait();
}
System.out.println("
等待CORBA客戶端調用
...");
} catch (Exception e) {
System.err.println("
錯誤
: " + e);
e.printStackTrace(System.out);
}
}
}


4. 客戶端程序(HelloClient.java
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloClient {
public static void main(String args[]) {
try {
/*
創建和初始化 ORB */
ORB orb = ORB.init(args, null);
/*
獲取根命名上下文
*/
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
/*
解析命名中的對象引用
*/
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = { nc };
Hello h = HelloHelper.narrow(ncRef.resolve(path));
/*
調用 Hello 服務器對象並打印結果
*/
System.out.println("
我在客戶端,開始調用CORBA服務器端的'sayHello'方法
");
System.out.println("
歡迎
, " + h.sayHello("javamxj blog"));
} catch (Exception e) {
System.out.println("
錯誤
: " + e);
e.printStackTrace(System.out);
}
}
}



CORBA Server/Client的編譯與運行

· 把上面4個文件複製到D:\CorbaSample目錄下,在此目錄下建立ClientServer目錄,假設它們分別爲客戶端和服務端。

· 編譯Hello.idl
D:\CorbaSample>idlj -oldImplBase -fall Hello.idl
這會生成一個HelloApp的目錄

· 編譯所有java文件:
D:\CorbaSample>javac *.java HelloApp/*.java

·
分別在ClientServer目錄下建立HelloApp子目錄,將D:\CorbaSample\HelloApp目錄中的
_HelloStub.class
Hello.class
HelloHelper.class
HelloHolder.class
HelloOperations.class
複製到D:\CorbaSample\Client\HelloApp目錄下,再將D:\CorbaSample目錄中的HelloClient.class複製到D:\CorbaSample\Client目錄下。

D:\CorbaSample\HelloApp目錄中的
_HelloImplBase.class
Hello.class
HelloOperations.class
複製到D:\CorbaSample\Server\HelloApp目錄下,再將D:\CorbaSample目錄中的HelloServer.class HelloImpl.class 複製到D:\CorbaSample\Server目錄中
(注意:當然,你可以不必建立ServerClient目錄及以上覆制文件的操作,可以直接在D:\CorbaSample目錄中進行操作,我這樣做的目的主要是爲了區分客戶端和服務端)


· 確保名字服務器處於運行狀態:
D:\CorbaSample\Server>tnameserv -ORBInitialPort 1050


· 在另一個DOS窗口啓動 Hello 服務器:
D:\CorbaSample\Server>java HelloServer -ORBInitialPort 1050

·
又再在另一個DOS窗口啓動CORBA客戶端調用CORBA服務:
D:\CorbaSample\Client>java HelloClient -ORBInitialPort 1050
(本地調用,不需要用-ORBInitialHost參數來指定遠程的IP地址)

D:\CorbaSample\Server>java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050
(遠程調用CORBA服務,可以將localhost替換成遠程的IP地址)

發佈了13 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章