|
| |
 |
CORBA編 |
 |
◆CORBAとは? |
| CORBAとはCommon Object Request Broker
Architectureの略です。OMG(Object Management Group)が定めた分散オブジェクト技術の仕様で、これを用いることによってネットワーク上に分散しているプログラムを利用したり、相互に連動させて動かしたりすることができます。 |
| ◆ここでの環境 |
| OS |
Windows 2000 |
| J2SE SDK |
1.4.0 |
|
|
|
| ◆OMG IDLによるインターフェース定義の作成 |
| OMG IDLとはOMG(Object Management Group)が定めたインターフェースのを記述する言語です。IDLとはInterface
Definition Languageの略です。下が今回使用するインターフェース定義です。 |
| Hello.idl(ここからダウンロード) |
module HelloApp
{
interface Hello
{
string sayHello();
oneway void shutdown();
};
}; |
|
|
| ◆IDLファイルからJavaソースの生成 |
| idljというコマンドで生成できます。-fallオプションを指定することによって、スタブとスケルトンのJavaソースファイルを生成できます。 |
| コマンドプロンプト |
| C:\JavaHello\CORBA>idlj
-fall Hello.idl C:\JavaHello\CORBA> |
|
| これでHelloAppフォルダの下に以下のファイルが生成されます。 |
|
|
| ◆生成されるファイルの説明 |
| ソースファイル |
説明 |
| HelloPOA.java |
サーバーのスケルトンクラス extends
org.omg.PortableServer.Servant
implements HelloApp.HelloOperations,
org.omg.CORBA.portable.InvokeHandler |
| _HelloStub.java |
クライアントのスタブクラス extends
org.omg.CORBA.portable.ObjectImpl
implements HelloApp.Hello |
| Hello.java |
IDLインターフェースのJava版 extends
HelloOperations, org.omg.CORBA.Object,
org.omg.CORBA.portable.IDLEntity |
| HelloOperations.java |
IDLで定義したsayHello()メソッドを持つインターフェース |
| HelloHelper.java |
CORBAオブジェクトを適切なタイプにキャストするために使うnarrow()メソッドを持つクラス。CORBAストリームへの書き込みと、読み込みを行うメソッドを持ち、このメソッドはHelloHolderクラスで利用される。 |
| HelloHolder.java |
Helloインターフェースをパブリックメンバに持つ。CORBAストリームへの書き込みと、読み込みを行うためにHelloHeloperクラスを使用する。
implements org.omg.CORBA.portable.Streamable
|
|
| ◆サーバー側Javaソースファイルの作成 |
| HelloWorldCorbaServer.java(ここからダウンロード) |
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;
import java.util.Properties;
class HelloImpl extends HelloPOA {
private ORB orb;
public void setORB(ORB orb_val) {
orb = orb_val;
}
public String sayHello() {
return "Hello World";
}
public void shutdown() {
orb.shutdown(false);
}
}
public class HelloWorldCorbaServer {
public static void main(String args[]) {
try{
// ORBの生成と初期化を行います
ORB orb = ORB.init(args, null);
// RootPOAの参照を取得しPOAManagerを使用可能にします
POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
// サーバントを生成し、それにORBを登録します
HelloImpl helloImpl = new HelloImpl();
helloImpl.setORB(orb);
// サーバントからHelloオブジェクトの参照を取得します
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.narrow(ref);
// ネームサービスを検索してネームサービスの参照を取得します
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// Helloオブジェクトの参照をネームサービスに登録します
String name = "Hello";
NameComponent path[] = ncRef.to_name( name );
ncRef.rebind(path, href);
System.out.println("HelloWorldCorbaServerが起動しました");
// クライアントからの呼び出しを待ちます
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("HelloWorldCorbaServerを停止します");
}
}
|
|
| |
|
|
| ◆クライアント側Javaソースファイルの作成 |
| HelloWorldCorbaClient.java(ここからダウンロード) |
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
public class HelloWorldCorbaClient {
static Hello helloImpl;
public static void main(String args[]) {
try{
// ORBの生成と初期化を行います
ORB orb = ORB.init(args, null);
// ネームサービスを検索してネームサービスの参照を取得します
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// ネームサービスからHelloオブジェクトの参照を取得します
String name = "Hello";
helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
// sayHello()メソッドを実行します
System.out.println(helloImpl.sayHello());
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
|
|
|
|
| ◆コンパイル |
| コマンドプロンプト |
| C:\JavaHello\CORBA>javac
*.java HelloApp\*.java C:\JavaHello\CORBA> |
|
| ◆orbdの起動 |
| orbdはObject Request Broker Daemonの略です。ORBのデーモンプログラムで、クライアントがネームサービスの使用してオブジェクトを取得し、そのオブジェクトを利用できるようにします。コマンドライン引数にポート番号を指定します。 |
| コマンドプロンプト |
| C:\>start orbd -ORBInitialPort
1050 |
|
| 正常に起動すると画面には何も表示されない状態になります。 |
| ◆サーバー側のアプリケーションの実行 |
| コマンドプロンプト |
C:\JavaHello\CORBA>java
HelloWorldCorbaServer -ORBInitialPort 1050 -ORBInitialHost
localhost
HelloWorldCorbaServerが起動しました |
|
-ORBInitialPort 1050
-ORBInitialHost localhost の説明
ORBのデーモンプグラム(orbd)が動いているサーバーのポート番号とホスト名を指定します。ここではlocalhostで動いているで上記のようになります。 |
| ◆クライアント側のアプリケーションの実行 |
| コマンドプロンプト |
C:\JavaHello\CORBA>java
HelloWorldCorbaClient -ORBInitialPort 1050 -ORBInitialHost
localhost
Hello World C:\JavaHello\CORBA> |
|
| おおおお!表示されましたね! |
|
|
| 参考URL |
| http://java.sun.com/j2se/1.4/docs/guide/idl/index.html |
■書籍
Java関連の書籍 |
|
| |
|
| |
| ツールの部屋
- Java関連の書籍
- デザインパターン - 情報交換掲示板
- HOME |