WebOTX Manual V11.1 (第6版) 目次を表示 |
interface Calc { readonly attribute double memory; double add(in double a, in double b); double sub(in double a, in double b); double mul(in double a, in double b); double div(in double a, in double b); void mc(); double mr(); void ms(in double a); void mp(in double a); };interfaceは、C++のclass定義に相当します。readonly attributeは読み出し専用の属性であることを示します。各オペレーションの引数の前にある"in"はオペレーションに渡すための引数であり、オペレーションによって値が設定されることはないことを示します。引数を持たないときはかっこ内には何も書きません。 calcは簡易電卓オブジェクトのインタフェースです。1つの属性(アトリビュート)定義と8つのオペレーション定義からなります。
> i2cc calc.idl
Caution i2ccへのパスが正しく設定されている必要があります。
Caution これらのファイルの内容をアプリケーション開発者は意識する必要はありません。また、生成されたソースコードは決して変更しないでください。変更した場合の動作は保証できません。
ファイル名は、ソースファイルの拡張子を除いたファイル名を元にして、それぞれ「.h」、「cmn.cpp」、「imp.cpp」をつけ加えて決定しています。Caution アプリケーション開発者はこの名前のファイルを作成しないようにしてください。同じ名前のファイルが存在する場合でも、IDLコンパイラは警告なしに上書きします。
// IDL interface Foo{...}; // C++ class POA_Foo{...};
// IDL module M{ interface Foo{...}; }; // C++ class POA_M::Foo{...};
サンプルではPOA_Calcクラスになります。 サンプルでは実装クラスはCalc_iです。上記のとおり、POA_Calcクラスを継承しています。
calc_i.hclass Calc_i : public virtual POA_Calc { CORBA::Double mem; public: Calc_i(); virtual ~Calc_i(); virtual CORBA::Double add( CORBA::Double a, CORBA::Double b, CORBA::Environment& env = Ob_default_environment() ); virtual CORBA::Double sub( CORBA::Double a, CORBA::Double b, CORBA::Environment& env = Ob_default_environment() ); virtual CORBA::Double mul( CORBA::Double a, CORBA::Double b, CORBA::Environment& env = Ob_default_environment() ); virtual CORBA::Double div( CORBA::Double a, CORBA::Double b, CORBA::Environment& env = Ob_default_environment() ); virtual void mc( CORBA::Environment& env = Ob_default_environment() ); virtual CORBA::Double mr( CORBA::Environment& env = Ob_default_environment() ); virtual void ms( CORBA::Double a, CORBA::Environment& env = Ob_default_environment() ); virtual void mp( CORBA::Double a, CORBA::Environment& env = Ob_default_environment() ); };各実装メンバ関数は仮想関数です。 IDLのデータ型とC++でのデータ型とのマッピングに関しては、[Object Broker > C++マッピング] の説明を参照してください。 calc_i.cppの一部を示します。
#include <iostream> #include "orb.h" #include "calc.h" #include "calc_i.h" Calc_i::Calc_i() { mem = 0; } Calc_i::~Calc_i() { } CORBA::Double Calc_i::add(CORBA::Double a, CORBA::Double b, CORBA::Environment&) { return (a + b); }Calc_iクラスのオペレーションを表す各メンバ関数内にサーバアプリケーションロジックを記述します。
// ORBの初期化 : サーバ/クライアントに関わらず必須 CORBA::ORB_var orbobj = CORBA::ORB_init(argc, argv, "ObjectSpinner");
// ルートPOAの取得 CORBA::Object_var tmpobj = orbobj->resolve_initial_references("RootPOA"); PortableServer::POA_ptr poa = PortableServer::POA::_narrow(tmpobj); // ポリシーリストの作成 CORBA::PolicyList plist(7); plist.length(7); plist[0] = poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL); ... // 子POAの作成 PortableServer::POA_ptr child_poa = poa->create_POA("POA名", PortableServer::POAManager::_nil(), plist); ...
// サーバントを作成 Calc_i* calcsvt = new Calc_i; // サーバントを活性化 Calc_var calcobj = calcsvt->_this();calcサンプルでは、作成したオブジェクトリファレンスを文字列に変換してファイルに書き出します。クライアント側ではこのファイルを読み込んでオブジェクト呼び出しに利用します。 オブジェクトの取得については、[Object Broker > オブジェクトリファレンスの取得] を参照してください。
ofstream strm("Calc.ref"); CORBA::String_var str = orb->object_to_string(calcobj); strm << str << endl;
PortableServer::POAManager_var poamgr = poa->the_POAManager(); poamgr->activate();
orbobj->run();また、[リファレンス > API > WebOTXが提供するAPI > CORBA > WebOTX ObjectBroker C++ > CORBA::ORB::work_pending] と [リファレンス > API > WebOTXが提供するAPI > CORBA > WebOTX ObjectBroker C++ > CORBA::ORB::perform_work] を組み合わせて独自のリクエスト処理ループを作成することができます。
for(;;) { if (orbobj->work_pending()) { ... orbobj->perform_work(); ... } }CORBA::ORB::work_pending()はクライアントからの要求を調べます。 CORBA::ORB::work_pendingの動作はサーバのスレッド処理方針により異なります。
Caution [リファレンス > API > WebOTXが提供するAPI > CORBA > WebOTX ObjectBroker C++ > CORBA::ORB::shutdown] オペレーションが呼ばれた後のCORBA::ORB::work_pending()は、常に0を返すようになります。
CORBA::ORB::perform_work()は要求を処理します。このメンバの中から実装クラスのオペレーション実装メンバ関数が呼ばれます。 終了前には、CORBA::ORB::shutdownを呼び出してクライアントからの受付を終了します。つぎに、POAの終了処理として、PortableServer::POA::create_POAなどで生成したPOAを解放します 解放は、[リファレンス > API > WebOTXが提供するAPI > CORBA > WebOTX ObjectBroker C++ > PortableServer::POA::destroy] を使って行います。PortableServer::POA::destroyは、呼び出したPOAの子POAに対して再帰的にdestroyを呼び出します。最後に、ORBの終了処理として、CORBA::ORB_initで得たORBオブジェクトを解放します。解放は、[リファレンス > API > WebOTXが提供するAPI > CORBA > WebOTX ObjectBroker C++ > CORBA::release] を用いて明示的に(CORBA::ORB_ptr型を使っているとき)、またはCORBA::ORB_var型を使って暗黙的に行います。// POAの解放 poa->destroy(1, 0);
% g++ -o calcsrv -I$(OrbRoot)/namespace/include -D_REENTRANT -D_GNU_SOURCE server.C calcimp.C calccmn.C calc_i.C -L$(OrbRoot)/namespace/lib -lnsospi -ldl -lpthread
開発環境 | Release版 | Debug版 |
---|---|---|
Visual C++ 2012 | nosp9015.lib | nosp9015d.lib |
Visual C++ 2013 | nosp9017.lib | nosp9017d.lib |
Visual C++ 2015 | nosp_2015.dll | nosp_2015.lib |
Visual C++ 2017 | nosp_2017.dll | nosp_2017.lib |
Visual C++ 2019 | nosp_2019.dll | nosp_2019.lib |
ifstream strm("Calc.ref"); strm >> ref; CORBA::Object_var objPtr = orb->string_to_object(ref, env);上記以外の取得方法は、[Object Broker > オブジェクトリファレンスの取得] を参照してください。
Calc_var calc = Calc::_narrow(tobj);Calcクラスの_narrowスタティックメンバにより行います。
CORBA::Double result; result = calc->add(1024, 2048, env);
% g++ -o calccli -I$(OrbRoot)/namespace/include -D_REENTRANT -D_GNU_SOURCE client.C calccmn.C -L$(OrbRoot)/namespace/lib -lnsospi -ldl -lpthread
開発環境 | Release版 | Debug版 |
---|---|---|
Visual C++ 2012 | nosp9015.lib | nosp9015d.lib |
Visual C++ 2013 | nosp9017.lib | nosp9017d.lib |
Visual C++ 2015 | nosp_2015.dll | nosp_2015.lib |
Visual C++ 2017 | nosp_2017.dll | nosp_2017.lib |
Visual C++ 2019 | nosp_2019.dll | nosp_2019.lib |
% systemctl start ObjectBroker<バージョン識別子>
% ./calcsrv & % ./calccli
> start .\calcsrv > .\calccli
Caution calcsrvを起動する場所を変更すると、Calc.refの内容も変わります。プログラムを実行する前に、古いCalc.refを削除してください。
Ob_SvrInitialArg arg(argv[1]); // argv[1]は「OBARG:」で始まる文字列 CORBA::Object_var obj = arg.this_object();上記コードにより自動起動のきっかけとなったオブジェクトのオブジェクトリファレンスがobjに入ります。
Caution Windowsで自動起動サーバのパス名に空白(' ')が含まれている場合で、WinMainではなく、mainでプログラムを記述しているときには、含まれている空白の数だけ引数が増えて渡されます。この場合、「OBARG:」で始まる文字列がargv[1]になるように調整してからCORBA::ORB_initを呼んでください。このとき、自動起動引数の位置を指定している場合は、argv[1]ではなく適切な場所になるようにしてください。
下記コードにより自動起動のきっかけとなったオブジェクトのオブジェクトIDがoidに入ります。PortableServer::POA_ptr poa = ... // サーバントを活性化するPOA PortableServer::ObjectId_var oid = poa->reference_to_id(obj);
CORBA::ORB_var orbobj = CORBA::ORB_init(...); ... // 非共有サーバを指定するとき orbobj->__server_activation_policy(Obi::UnsharedServer);サーバの活性化処理方針の設定は、CORBA::ORB::resolve_initial_referencesでルートPOAを取得する前に行ってください。 設定で指定するには、"インプリメンテーション名"ActPolicyにcorba_sharedserver(共有サーバ)、corba_unsharedserver(非共有サーバ)、corba_persistentserver(永続サーバ)、または、corba_serverpermethod(メソッドごとのサーバ)を設定します。具体的設定方法については [ 関連製品 > Object Broker Java TM > 構築・運用 > 環境設定 ] を参照してください。
CORBA::ORB_var orbobj = CORBA::ORB_init(...); ... // メソッドごとのスレッド方針を指定するとき orbobj->__server_thread_policy(Ob_thr_permethod); ... // プールスレッド方針を指定するとき orbobj->__server_thread_policy(Ob_thr_pool);サーバプロセスのスレッド処理方針の設定は、CORBA::ORB::runおよびCORBA::ORB::work_pendingを実行する前に行ってください。 設定で指定するには、"インプリメンテーション名"ThreadPolicyにpermethodあるいはpoolを設定します。"メソッドごとのスレッド方針"に設定する場合はpermethodを設定します。"プールスレッド方針"に設定する場合はpoolを設定します。具体的設定方法については [ 関連製品 > Object Broker Java TM > 構築・運用 > 環境設定 ] を参照してください。
// IDL interface MyInterface { void MyOp(in long arg); ... };
i2cc -TIE "ファイル名".idl
template <class T> class MyInterface_tie : public POA_MyInterfcae { public: // tに結び付ける実装オブジェクトを指定する MyInterface_tie(T& t); // poaに実装オブジェクトを活性化するPOAを指定する MyInterface_tie(T& t, PortableServer::POA_ptr poa); // tpに結び付ける実装オブジェクトを指定する // releaseに1を指定すると、デストラクタで実装オブジェクトの領域を解放する MyInterface_tie(T* tp, CORBA::Boolean release = 1); MyInterface_tie(T* tp, PortableServer::POA_ptr poa, CORBA::Boolean release = 1); ~MyInterface_tie(); T* _tied_object(); // 結びつけられている実装オブジェクトを返す // 実装オブジェクトを結びつける void _tied_object(T& obj); // releaseに1を指定すると、デストラクタで実装オブジェクトの領域を解放する void _tied_object(T* obj, CORBA::Boolean release = 1); ... };TIEオブジェクトのコンストラクタまたは_tied_object(T&)メソッドによりTIEオブジェクトと実装オブジェクトを結び付けます。
// C++ class MyImpl_tie { public: MyImpl_tie() {...} ~MyImpl_tie() {...} void MyOp(CORBA::Long, CORBA::Environment&); // MyOpの実装 ... }; void MyImpl_tie::MyOp(CORBA::Long arg, CORBA::Environment&) { // MyOpオペレーションの実装 ... }
// C++ main(...) { // ORB の初期化 CORBA::ORB_ptr orb = CORBA::ORB_init(...); // ルートPOA の取得 CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); PortableServer::POA_ptr poa = PortableServer::POA::_narrow(obj); // サーバント(実装オブジェクト)の作成 MyImpl_tie* my_svt = new MyImpl_tie; // TIE オブジェクトの作成 MyInterface_tie<MyImpl_tie> tie_obj(my_svt, poa); // サーバントの活性化 MyInterface_var my_obj = tie_obj._this(); // POA の活性化 PortableServer::POAManager_var poamgr = poa->the_POAManager(); poamgr->activate(); // リクエスト処理待ちと実行 orb->run(); // 終了処理 poa->destroy(1, 0); CORBA::release(orb); }
// IDL interface MyInterface { void MyOp(in long arg); ... };
// C++ // 実装オブジェクトクラス class MyImpl : POA_MyInterface { public: ... void MyOp(CORBA::Long, CORBA::Environment&); ... }; main() { CORBA::ORB_var orb = CORBA::ORB_init(...); ... PortableServer::POA_ptr rootPOA = ... // ルートPOAの取得 // LifespanPolicyとしてPERSISTENTをもつPOAを作成 CORBA::PolicyList plist; plist.length(1); plist[0] = rootPOA->create_lifespan_policy(PortableServer::PERSISTENT); PortableServer::POA_ptr poa = rootPOA->create_POA("MyPOA", PortableServer::POAManager::_nil(), plist); // サーバントを作成 MyImpl* svt = new MyImpl; // サーバントを活性化 PortableServer::ObjectId_var oid = poa->activate_object(svt); // オブジェクトIDからオブジェクトリファレンスを取得 CORBA::Object_var obj = poa->id_to_reference(*oid); ... }
> cd <サンプルインストールディレクトリ>\corba\obcpp\calc > devenv calcsrv.sln /build release > devenv calccli.sln /build releaseサーバプログラムを実行します。
> cd <サンプルインストールディレクトリ>\corba\obcpp\calc\release > calcsrv別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> cd <サンプルインストールディレクトリ>\corba\obcpp\calc\release > calccli got Calc Object Reference 1024 + 2048 = 3072 memory store 3072 1024 - 2048 = -1024 3.1415926 * 400 = 1256.64 memory recall = 3072 4096 / 365 = 11.2219 memory + 11.2219 memory recall = 3083.22 memory clear = 0 exiting.. >サーバプログラムを終了させるには、クライアントを起動する時の引数に"svstop"を指定します。 もしくは、サーバプロセスを終了させます。
> cd <サンプルインストールディレクトリ>\corba\obcpp\calc2 > devenv regobj.sln /build release > devenv calcsrv.sln /build release > devenv calccli.sln /build release別のコマンドプロンプトウィンドウを開き、インプリメンテーションの自動登録ツールregobjを用いて、calcsrvを登録します。
> cd <サンプルインストールディレクトリ>\corba\obcpp\calc2\release > regobj Calc Calc_i calcsrvのフルパス myobj別のコマンドプロンプトを開き、クライアントプログラムを実行します。 サーバプログラムは自動起動され、出力として以下のように表示されます。
> cd <サンプルインストールディレクトリ>\corba\obcpp\calc2\release > calccli myobj 1024 + 2048 = 3072 memory store 3072 1024 - 2048 = -1024 3.1415926 * 400 = 1256.64 memory recall = 3072 4096 / 365 = 11.2219 memory + 11.2219 memory recall = 3083.22 memory clear = 0 exiting.. >サーバプログラムを終了させるには、クライアントを起動する時の引数に"svstop"を追加します。 もしくは、サーバプロセスを終了させます。
デフォルトでの使用例 (POA1) | 全てデフォルトのPOAポリシーで動作するサンプルです。POAやServantを初期化時に準備します。 |
AdapterActivator使用例 (POA2) | POAやServantをオペレーション呼出のタイミングで動的に生成するサンプルです。アダプタアクティベータ(AdapterActivator)機能を利用しています。 |
ServantActivator使用例 (POA3) | Servantをオペレーション呼出のタイミングで動的に生成するサンプルです。サーバントマネージャ(ServantManager)機能を利用しています。 |
ServantLocator使用例 (POA4) | Servantを動的に毎回生成するサンプルです。サーバントマネージャ(ServantManager)機能とNON_RETAINポリシーを利用しています。 |
USE_DEFAULT_SERVANTポリシー使用例 (POA5) | ひとつのServantが複数のオブジェクトリファレンスに対応して動作するサンプルです。デフォルトサーバント(DefaultServant)機能とUSER_ID、MULTIPLE_IDポリシーを利用しています。 |
SINGLE_THREAD_MODELポリシー使用例 (POA6) | ユーザが定義するServant、サーバントマネージャ(ServantManager)、アダプタアクティベータ(AdapterActivator)の処理がすべて1つのメインスレッド上で動作するサンプルです。SINGLE_THREAD_MODELポリシーを利用しています。 |
ORB_CTRL_ MODELポリシー使用例 (POA7) | ユーザが定義するServant、サーバントマネージャ(ServantManager)、アダプタアクティベータ(AdapterActivator)の処理が、Object Brokerが管理する任意スレッド上で動作するサンプルです。ORB_CTRL_MODELポリシーを利用しています。 |
TRANSIENTポリシー使用例 (POA8) | オブジェクトリファレンスの有効期間がPOAのライフサイクルと関係して動作するサンプルです。TRANSIENTポリシーを利用しています。 |
PERSISTENTオブジェクトの手動起動サーバでの実装例 (POA9) | オブジェクトリファレンスの有効期間がPOAのライフサイクルとは関係なく動作するサンプルです。PERSISTENTポリシーを利用しています。 |
TRANSIENTポリシーかつIMPLICIT_ACTIVATIONポリシーの例 (POA10) | Servantの明示的な活性化を行わずに動作するサンプルです。TRANSIENT,IMPLICIT_ACTIVATIONポリシーを利用しています。 |
PERSISTENTポリシーかつIMPLICIT_ACTIVATIONポリシーの例 (POA11) | POA10と同様、Servantの明示的な活性化を行わずに動作するサンプルです。こちらはPERSISTENT,IMPLICIT_ACTIVATIONポリシーを利用しています。 |
POAManagerのサンプル (POA12) | POAの状態に応じて動作するサンプルです。POA マネージャ(POA Manager)という機能を利用しています。 |
TIEアプローチのサンプル (POA13) | POA1をPOAのTIEクラスで動作させるサンプルです。 |
自動起動サーバのサンプル (POA14) | POA9を自動起動サーバとして動作させるサンプルです。 |
module AddressMapping { typedef string<43> AM_MAP; typedef sequence<AM_MAP,10> AM_MAPS; interface AddressMap_1 { attribute unsigned long map_num; boolean add(in string name, in string phone); boolean search(in string name, out AM_MAP map); boolean delete(in string name); boolean list(out AM_MAPS maps); }; };このようにサンプルの機能自体は同じものですが、サーバを構成するPOAのポリシーを変えることによって、その動作がどう異なるかを複数のサンプルによって実現しています。
Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?1. は、アドレス帳の登録件数を表示します。
Please select number? 1 -------------------------- --> Get start. Get number of all maps = 52. は、アドレス帳への登録を行います。メッセージに応じて、名前と電話番号を入力してください。
Please select number? 2 -------------------------- --> Add start. name? sample1 phone? 111-1111 add() calling ..........OK.3. は、アドレス帳からの削除を行います。メッセージに応じて、名前を入力してください。
Please select number? 3 -------------------------- --> Delete start. name? sample1 delete() calling ..........OK.4. は、アドレス帳からの検索を行います。メッセージに応じて、名前を入力してください。
Please select number? 4 -------------------------- --> Search start. name? sample12_3 search() calling ..........OK. name / phone ------------------------------------------- sample12_3 / 333-33335. は、アドレス帳に登録されている情報を一覧表示します。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- Sample1 / 111-1111 Sample2 / 222-2222 Sample3 / 333-33336. は、現在保持しているオブジェクトリファレンスを文字列に変換したものを表示します。また、カレントディレクトリに "objref.dat" という名前のファイルを出力します。
Please select number? 6 -------------------------- --> Display start.(local) Object reference: IOR:000000000000002249444c3a416464726573734d617070696e672f4164 64726573734d61703a312e300000000000000100000000000000a000010000000000087072696d65 72610004fc000000000088004e4f7262040100000000000000002249444c3a416464726573734d61 7070696e672f416464726573734d61703a312e30000000000000010000000000000000000000d083 84d0880000003c00504f4101000000000000072f6d79504f41000000000024004e504f4101000000 0000072f6d79504f41000000000000000000d08384d088000000007. は、新たにオブジェクトリファレンスを再取得します。
Please select number? 7 -------------------------- --> Obtain start.(local)
POAポリシー | POAサンプル番号 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | |
Thread Policy | ||||||||||||||
ORB_CTRL_MODEL (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |
SINGLE_THREAD_MODEL | ○ | |||||||||||||
Lifespan Policy | ||||||||||||||
TRANSIENT (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
PERSISTENT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
Object Id Uniqueness Policy | ||||||||||||||
UNIQUE_ID ( 既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
MULTIPLE_ID | ○ | ○ | ||||||||||||
Id Assignment Policy | ||||||||||||||
SYSTEM_ID (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||
USER_ID | ○ | ○ | ○ | ○ | ||||||||||
Servant Retention Policy | ||||||||||||||
RETAIN (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |
NON_RETAIN | ○ | |||||||||||||
Request Processing Policy | ||||||||||||||
USE_ACTIVE_OBJECT_MAP_ONLY (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||
USE_SERVANT_MANAGER | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
USE_DEFAULT_SERVANT | ○ | |||||||||||||
Implicit Activation Policy | ||||||||||||||
NO_IMPLICIT_ACTIVATION (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
IMPLICIT_ACTIVATION | ○ | ○ |
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA1
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = 3] name = sample1, phone = 111-1111 ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = 3] ===== AMapServant/list() end. quit. goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA2
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit! ===== AMapAdapterActivator/unknown_adapter() start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapAdapterActivator/unknown_adapter() end. ===== AMapServant/add() start. [Thread name = 3] name = sample2, phone = 222-2222 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = 3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA3
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. If you want to stop ServerAP, key quit! ===== AMapServantActivator/incarnate() start. [Thread name = 3] ===== AMapServant created. type: TRANSIENT ===== AMapServantActivator/incarnate() end. ===== AMapServant/add() start. [Thread name = 3] name = sample3, phone = 333-3333 ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = 3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA4
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. If you want to stop ServerAP, key quit! ===== AMapServantLocator/preinvoke() start. [Thread name = 3] For add operation. ===== AMapServant created. type: TRANSIENT ===== AMapServantLocator/preinvoke() end. ===== AMapServant/add() start. [Thread name = 3] name = sample4, phone = 444-4444 ===== AMapServant/add() end. ===== AMapServantLocator/postinvoke() start. [Thread name = 3] For add operation. ===== AMapServantLocator/postinvoke() end. ===== AMapServantLocator/preinvoke() start. [Thread name = 3] For list operation. ===== AMapServant created. type: TRANSIENT ===== AMapServantLocator/preinvoke() end. ===== AMapServant/list() start. [Thread name = 3] ===== AMapServant/list() end. ===== AMapServantLocator/postinvoke() start. [Thread name = 3] For list operation. ===== AMapServantLocator/postinvoke() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA5
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = 3] name = sample5, phone = 555-5555 ===== AMapServant/add() end. Connect request accepted ===== AMapServant/list() start. [Thread name = 4] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
Please select number? 2 -------------------------- --> Add start. name? sample5 phone? 555-5555 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample5 / 555-5555
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA6
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA7
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample7 phone? 777-7777 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample7 / 777-7777サーバのメッセージから、ユーザが定義したAdapterActivator、ServantActivater、Servantがすべてメインスレッド以外で実行されていることが分かります。また、別のクライアントからの要求が異なるスレッドで実行されていることが分かります。
> server ===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit! ===== AMapAdapterActivator/unknown_adapter() start. [Thread name = 3] ===== myPOA created. ===== AMapAdapterActivator/unknown_adapter() end. ===== AMapServantActivator/incarnate() start. [Thread name = 3] ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServantActivator/incarnate() end. ===== AMapServant/add() start. [Thread name = 3] name = sample7, phone = 777-7777 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServantActivator/incarnate() start. [Thread name = 4] ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServantActivator/incarnate() end. ===== AMapServant/list() start. [Thread name = 4] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA8
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit or refresh!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 6 -------------------------- --> Display start.(local) Object reference: IOR:000000000000002249444c3a416464726573734d617070696e672f4164 64726573734d61703a312e300000000000000100000000000000a000010000000000087072696d65 7261000488000000000088004e4f7262040100000000000000002249444c3a416464726573734d61 7070696e672f416464726573734d61703a312e30000000000000010000000000000000000000d082 a60d300000003c00504f4101000000000000072f6d79504f41000000000024004e504f4101000000 0000072f6d79504f41000000000000000000d082a60d3000000000サーバを再起動し、クライアント(B)でオブジェクトリファレンスを取得し、再度表示します。
Please select number? 6 -------------------------- --> Display start.(local) Object reference: IOR:000000000000002249444c3a416464726573734d617070696e672f4164 64726573734d61703a312e300000000000000100000000000000a000010000000000087072696d65 7261000491000000000088004e4f7262040100000000000000002249444c3a416464726573734d61 7070696e672f416464726573734d61703a312e30000000000000010000000000000000000000d082 a703480000003c00504f4101000000000000072f6d79504f41000000000024004e504f4101000000 0000072f6d79504f41000000000000000000d082a7034800000000サーバを再起動する前と、再起動後に再取得したオブジェクトリファレンスが異なることが分かります。再取得前に古いオブジェクトリファレンスのままリクエストすると、以下のように例外が発生します。
Please select number? 5 -------------------------- --> List start. list() calling .....error!!! CORBA::NO_RESPONSE exception occurred. minor = 1186, completed = CORBA::COMPLETE D_NO
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA9
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] If you want to stop ServerAP, key quit or refresh!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA10
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapClient started. ===== target = AMapObj2 -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample10 phone? 101-0101 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample10 / 101-0101サーバのメッセージから、初期化時にservant_to_reference()を使用するだけで暗黙のうちにServantは活性化されており、クライアントからのリクエスト時には明示的な活性の場合と同様に処理されることが分かります。また、異なるオブジェクトリファレンスによるリクエストでも同じServantが対応しますので、2つのクライアントが同じアドレス帳を参照・更新していることが分かります。
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = 3] name = sample10, phone = 101-0101 ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = 3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA11
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = 3] name = sample11, phone = 111-1111 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = 3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA12
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. If you want to stop ServerAP, key quit!
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> server ===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = 3] name = sample12_1, phone = 111-1111 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = 3] name = sample12_2, phone = 222-2222 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = 3] name = sample12_3, phone = 333-3333 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = 3] name = sample12_4, phone = 444-4444 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = 3] name = sample12_5, phone = 555-5555 ===== Saving start. Holding(15sec.).....end. +------------------------------------------------------------- |※この間に受け付けたクライアント(C)からの要求は15秒間、 | 待たされます。 +------------------------------------------------------------- ===== AMapServant/list() start. [Thread name = 4] ===== AMapServant/list() end. ===== Saving end. ===== AMapServant/add() end. quit goodbye... ===== AMapServer end.
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA13
> devenv server2005.sln /build release > devenv client2005.sln /build release
===== AMapServer start. [Thread name = 3] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit!
> cd <サンプルインストールディレクトリ>\corba\obcpp\POA14
> devenv server2005.sln /build release > devenv client2005.sln /build release > devenv regobj2005.sln /build release
> regobj AddressMapping/AddressMap AMapServant serverのフルパス AMapObj
Caution serverのフルパスで指定したディレクトリにサンプル14のserverのデータファイルaddress.dat)が出力されます。このディレクトリには、oadを起動したユーザの書き込み許可が必要です。
===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> cd <サンプルインストールディレクトリ>\corba\obcpp\value1 > devenv val1server2005.sln /build release > devenv val1client2005.sln /build releaseサーバプログラムを実行します。
> Val1Server別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> Val1Client
図1.1.2.18-1
図1.1.2.18-2
図1.1.2.18-3
図1.1.2.18-4
module Calculator { interface Calc { long add(in long arg1, in long arg2); }; };Calcインタフェースに定義されたaddメソッドをみてください。"in long arg1", "in long arg2"という2つの引数が定義されています。"in"という宣言は、これらの引数がオブジェクトに渡されることを意味しています。addメソッドの戻り値の型はlong型です。IDL定義にはインタフェースだけを定義し、実装コードは記述しません。IDLの表記方法はC++に似ていますので、IDLを習得するのは容易です。
> i2j calc.idl※UNIX系OSの場合、以下の様にi2j.shを使用してください。
> $(OrbRoot)/bin/i2j.sh calc.idlコマンドを実行すると下記のファイルが作成されます。
Caution メソッドのシグネチャはスケルトンクラスで定義されているメソッドと同じものにしてください。スケルトンのメソッドはabstractと宣言されているので、メソッドの実装を忘れたり、違うシグネチャで実装してしまうとコンパイルエラーになります。
CalcServer.javaimport org.omg.CORBA.*; import org.omg.CosNaming.*; import org.omg.PortableServer.*; import Calculator.*; // Calcインタフェースの実装 class CalcObj extends CalcPOA { public int add(int arg1, int arg2) { System.out.println("add called!"); System.out.println("arg1="+arg1+",arg2="+arg2); return arg1 + arg2; } } public class CalcServer { public static void main(String args[]) { // Object Broker Java を使用するためのシステムプロパティ設定 System.setProperty("org.omg.CORBA.ORBClass", "jp.co.nec.orb.OSPORB"); System.setProperty("org.omg.CORBA.ORBSingletonClass", "jp.co.nec.orb.OSPORBSingleton"); try { // ORBの初期化 ORB orb = ORB.init(args, null); // POAオブジェクトの取得 POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // Calcインタフェースの実装オブジェクトの生成 CalcObj target = new CalcObj(); // 実装オブジェクトとORBを関連付け、オブジェクトリファレンスを取得 org.omg.CORBA.Object target_ref = poa.servant_to_reference(target); // 名前サービスのオブジェクトリファレンスを獲得 org.omg.CORBA.Object o = orb.resolve_initial_references("NameService"); NamingContext ns = NamingContextHelper.narrow(o); // 作成したオブジェクトと名前を関連付けるNameComponentの生成 NameComponent ncseq[] = { new NameComponent("CalcObj", "") }; // 名前サーバへの登録 ns.rebind(ncseq, target_ref); // POAManagerオブジェクトの活性化 POAManager poamgr = poa.the_POAManager(); poamgr.activate(); // クライアントからの要求処理ループの実行 orb.run(); } catch (Exception e) { e.printStackTrace(); } } }
import org.omg.CORBA.*; import org.omg.CosNaming.*; import Calculator.*; public class CalcClient { public static void main(String args[]) { // Object Broker Java を使用するためのシステムプロパティ設定 System.setProperty("org.omg.CORBA.ORBClass", "jp.co.nec.orb.OSPORB"); System.setProperty("org.omg.CORBA.ORBSingletonClass", "jp.co.nec.orb.OSPORBSingleton"); try { // ORBの初期化 ORB orb = ORB.init(args, null); // 名前サービスのオブジェクトリファレンスを獲得 org.omg.CORBA.Object o = orb.resolve_initial_references("NameService"); NamingContext ns = NamingContextHelper.narrow(o); // Calcオブジェクトと名前を関連付けるNameComponentの生成 NameComponent nc = new NameComponent("CalcObj", ""); NameComponent ncseq[] = {nc}; // 名前の検索とCalcオブジェクトのオブジェクトリファレンスの獲得 // Calcインタフェース型への変換 Calc calcobj = CalcHelper.narrow(ns.resolve(ncseq)); // addメソッドの実行 int ret = calcobj.add(1, 1); System.out.println("1+1=" + ret); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } }
> javac CalcServer.java CalcClient.java Calculator\*.javaこのコマンドは、クライアントとサーバの両方のアプリケーションをビルドします。
Caution コンパイルを行う前に、CLASSPATH環境変数にWebOTX Object Broker Javaのクラスライブラリが含まれているかを確認してください。
> java CalcServer作成したサーバやクライアントを実行する前に、WebOTX Object Brokerを起動しなければなりません。もし、起動されていなければエラーになります。上記のコマンドはWebOTX Object Brokerがデフォルトの設定で動作している場合を示しています。もし、WebOTX Object Brokerの設定をデフォルトから変更して動作させている場合は、特別な引数が必要になります。 このプログラムは自動的には終了しません。終了させるときはCTRL-Cをタイプして終了させてください。
> java CalcClient 1+1=2クライアントプログラムはサーバオブジェクトのaddメソッドの2つのパラメータにそれぞれ「1」を渡します。サーバはリクエストを受け取り、「2」を返します。クライアントは結果を表示します。 サーバはaddメソッドが呼ばれるたびにサーバが動作しているウィンドウ上に下記のメッセージを表示します。
Add called! arg1=1,arg2=1
import org.omg.CORBA.*; import org.omg.CosNaming.*; import org.omg.PortableServer.*; import Calculator.*; // Calcインタフェースの実装 class CalcObj extends CalcPOA { public int add(int arg1, int arg2) { System.out.println("add called!"); System.out.println("arg1="+arg1+",arg2="+arg2); return arg1 + arg2; } } public class CalcServer { public static void main(String args[]) { // Object Broker Java を使用するためのシステムプロパティ設定 System.setProperty("org.omg.CORBA.ORBClass", "jp.co.nec.orb.OSPORB"); System.setProperty("org.omg.CORBA.ORBSingletonClass", "jp.co.nec.orb.OSPORBSingleton"); try { // ORBの初期化 ORB orb = ORB.init(args, null); // POAオブジェクトの取得 POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // Calcインタフェースの実装オブジェクトの生成 CalcObj obj = new CalcObj(); // TIEオブジェクトの生成 CalcPOATie target = new CalcPOATie(obj); // 実装オブジェクトとORBを関連付け、オブジェクトリファレンスを取得 org.omg.CORBA.Object target_ref = poa.servant_to_reference(target); // 名前サービスのオブジェクトリファレンスを獲得 org.omg.CORBA.Object o = orb.resolve_initial_references("NameService"); NamingContext ns = NamingContextHelper.narrow(o); // 作成したオブジェクトと名前を関連付けるNameComponentの生成 NameComponent ncseq[] = { new NameComponent("CalcObj", "") }; // 名前サーバへの登録 ns.rebind(ncseq, target_ref); // POAManagerオブジェクトの活性化 POAManager poamgr = poa.the_POAManager(); poamgr.activate(); // クライアントからの要求処理ループの実行 orb.run(); } catch (Exception e) { e.printStackTrace(); } } }
import org.omg.CORBA.*; import org.omg.CosNaming.*; import org.omg.PortableServer.*; import Calculator.*; // Calcインタフェースの実装 class CalcObj extends CalcPOA { public int add(int arg1, int arg2) { System.out.println("add called!"); System.out.println("arg1="+arg1+",arg2="+arg2); return arg1 + arg2; } } public class CalcServer { public static void main(String args[]) { // Object Broker Java を使用するためのシステムプロパティ設定 System.setProperty("org.omg.CORBA.ORBClass", "jp.co.nec.orb.OSPORB"); System.setProperty("org.omg.CORBA.ORBSingletonClass", "jp.co.nec.orb.OSPORBSingleton"); try { // ORBの初期化 ORB orb = ORB.init(args, null); // POAオブジェクトの取得 POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // POAポリシーの作成。 // パーシステント、かつオブジェクトIDをプログラマが指定。 Policy plist[] = { poa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT), poa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID) }; POAManager pmgr = poa.the_POAManager(); // ポリシーに基づいて新たなPOAを作成 poa = poa.create_POA("mypoa", pmgr, plist); // Calcインタフェースの実装オブジェクトの生成 CalcObj target = new CalcObj(); // オブジェクトIDの生成 byte[] oid = "MyCalcObj".getBytes("8859_1"); if (args.length == 1 && args[0].equals("create")) { // プログラムの引数に"create"と指定されたら // オブジェクトリファレンスを作成し、名前サーバに登録して終了する。 org.omg.CORBA.Object calcref = poa.create_reference_with_id(oid, "IDL:Calculator/Calc:1.0"); // 名前サービスのオブジェクトリファレンスを獲得 org.omg.CORBA.Object o = orb.resolve_initial_references("NameService"); NamingContext ns = NamingContextHelper.narrow(o); // 作成したオブジェクトと名前を関連付けるNameComponentの生成 NameComponent ncseq[] = { new NameComponent("CalcObj", "") }; // 名前サーバへの登録 ns.rebind(ncseq, calcref); } else { // 上記以外は、オブジェクトを活性化する。 // オブジェクトIDを指定してオブジェクトを活性化 poa.activate_object_with_id(oid, target); // POAManagerオブジェクトの活性化 pmgr.activate(); // クライアントからの要求処理ループの実行 orb.run(); } } catch (Exception e) { e.printStackTrace(); } } }このプログラムでは、実行時の引数に"create"を指定して起動した時にオブジェクトリファレンスを作成し、名前サービスに登録しています。オブジェクトリファレンスの生成には、create_reference_with_idを使用します。create_reference_with_idには、オブジェクトIDとリポジトリIDを渡します。実行時の引数に何も指定せずに起動した時には、作成する時と同じオブジェクトIDを使用して、オブジェクトを活性化しています。オブジェクトの活性化はactivate_object_with_idを使用します。活性化した後で、要求処理ループを実行しています。
import org.omg.CORBA.*; import org.omg.CosNaming.*; import java.awt.Gaphics; import Calculator.*; public class CalcApplet extends java.applet.Applet { String message = ""; public void init() { try { // ORBの初期化 ORB orb = ORB.init(this, null); // 名前サービスのオブジェクトリファレンスを獲得 org.omg.CORBA.Object o = orb.resolve_initial_references("NameService"); NamingContext ns = NamingContextHelper.narrow(o); // Calcオブジェクトと名前を関連付けるNameComponentの生成 NameComponent nc = new NameComponent("CalcObj", ""); NameComponent ncseq[] = {nc}; // 名前の検索とCalcオブジェクトのオブジェクトリファレンスの獲得 // Calcインタフェース型への変換 Calc calcobj = CalcHelper.narrow(ns.resolve(ncseq)); // addメソッドの実行 int ret = calcobj.add(1, 1); message = "1+1=" + ret; } catch (Exception e) { message = "ERROR : " + e.toString(); e.printStackTrace(System.out); } } public void paint(Graphics g) { g.drawString(message, 25, 50); } }アプレットを実行するためにはHTMLファイルが必要です。
<html> <head> <title>Calc Applet</title> </head> <body> <applet codebase='.' code='CalcApplet.class' width=400 height=400 archive=ospiorb50.jar,ospiname50.jar> // 次のパラメータは環境に合わせて変更してください。 <param name=org.omg.CORBA.ORBInitialHost value=webserverhostname> // 次のパラメータはこのまま指定します。 <param name=org.omg.CORBA.ORBClass value=jp.co.nec.orb.OSPORB> <param name=org.omg.CORBA.ORBSingletonClass value=jp.co.nec.orb.OSPORBSingleton> </applet> </body> </html>この例では、リストの<applet>タグに含まれているarchiveに、WebOTX Object Broker Javaのクラスライブラリを指定しています。上記の例は、Object Broker Javaのクラスライブラリが、アプレットのクラスファイルと同じ場所にある場合の設定ですので、実際の環境に合わせて変更してください。ORBInitialHostはWebサーバのホスト名です。このホストで、WebOTX Object Brokerが動作している必要があります。 appletviewerを使用する場合、次のコマンドで起動します。
> appletviewer http://webserverhostname/?/CalcApplet.htm
図1.1.3-1
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\calc1 > makeサーバプログラムを実行します。
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc1Server別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\calc1 > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc1Client 0+0=0 1+1=2 2+2=4 3+3=6 4+4=8 5+5=10 6+6=12 7+7=14 8+8=16 9+9=18サーバプログラムは自動的には終了しませんので、Ctrl+C などで終了させてください。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\calc2 > makeサーバプログラムを実行します。
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc2Server別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\calc2 > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc2Client 1+1=2サーバプログラムは自動的には終了しませんので、Ctrl+C などで終了させてください。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\example > makeサーバプログラムを実行します。
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB CplxServer別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\example > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB CplxClient ret.l=2 ret.s=HelloWorld a2.l=2 a2.s=HelloWorld a3.l=2 a3.s=HelloWorldサーバプログラムは自動的には終了しませんので、Ctrl+C などで終了させてください。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\applet > makeCalc2で使用したサーバプログラムを実行します。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\calc2 > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc2ServerAppletViewerでURLを指定して実行します。
> appletviewer http://・・・/CalcApplet.htm
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\serversamp > makeサーバプログラムを実行します。
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc3ServerCalc3Serverは名前サーバにオブジェクトを登録し、クライアントからの要求を待ちます。 別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\serversamp > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Calc3Client 1+1=2サーバプログラムは自動的には終了しませんので、Ctrl+C などで終了させてください。
デフォルトでの使用例 (POA1) | 全てデフォルトのPOAポリシーで動作するサンプルです。POAやServantを初期化時に準備します。 |
AdapterActivator使用例 (POA2) | POAやServantをオペレーション呼出のタイミングで動的に生成するサンプルです。アダプタアクティベータ(AdapterActivator)機能を利用しています。 |
ServantActivator使用例 (POA3) | Servantをオペレーション呼出のタイミングで動的に生成するサンプルです。サーバントマネージャ(ServantManager)機能を利用しています。 |
ServantLocator使用例 (POA4) | Servantを動的に毎回生成するサンプルです。サーバントマネージャ(ServantManager)機能とNON_RETAINポリシーを利用しています。 |
USE_DEFAULT_SERVANTポリシー使用例 (POA5) | ひとつのServantが複数のオブジェクトリファレンスに対応して動作するサンプルです。デフォルトサーバント(DefaultServant)機能とUSER_ID、MULTIPLE_IDポリシーを利用しています。 |
SINGLE_THREAD_MODELポリシー使用例 (POA6) | ユーザが定義するServant、サーバントマネージャ(ServantManager)、アダプタアクティベータ(AdapterActivator)の処理がすべて1つのメインスレッド上で動作するサンプルです。SINGLE_THREAD_MODELポリシーを利用しています。 |
ORB_CTRL_ MODELポリシー使用例 (POA7) | ユーザが定義するServant、サーバントマネージャ(ServantManager)、アダプタアクティベータ(AdapterActivator)の処理が、ObjectBrokerが管理する任意スレッド上で動作するサンプルです。ORB_CTRL_MODELポリシーを利用しています。 |
TRANSIENTポリシー使用例 (POA8) | オブジェクトリファレンスの有効期間がPOAのライフサイクルと関係して動作するサンプルです。TRANSIENTポリシーを利用しています。 |
PERSISTENTオブジェクトの手動起動サーバでの実装例 (POA9) | オブジェクトリファレンスの有効期間がPOAのライフサイクルとは関係なく動作するサンプルです。PERSISTENTポリシーを利用しています。 |
TRANSIENTポリシーかつIMPLICIT_ACTIVATIONポリシーの例 (POA10) | Servantの明示的な活性化を行わずに動作するサンプルです。TRANSIENT,IMPLICIT_ACTIVATIONポリシーを利用しています。 |
PERSISTENTポリシーかつIMPLICIT_ACTIVATIONポリシーの例 (POA11) | POA10と同様、Servantの明示的な活性化を行わずに動作するサンプルです。こちらはPERSISTENT,IMPLICIT_ACTIVATIONポリシーを利用しています。 |
POAManagerのサンプル (POA12) | POAの状態に応じて動作するサンプルです。POA マネージャ(POA Manager)という機能を利用しています。 |
TIEアプローチのサンプル (POA13) | POA1をPOAのTIEクラスで動作させるサンプルです。 |
自動起動サーバのサンプル (POA14) | POA9を自動起動サーバとして動作させるサンプルです。 |
POAポリシー | POAサンプル番号 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | |
Thread Policy | ||||||||||||||
ORB_CTRL_MODEL (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |
SINGLE_THREAD_MODEL | ○ | |||||||||||||
Lifespan Policy | ||||||||||||||
TRANSIENT (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
PERSISTENT | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
Object Id Uniqueness Policy | ||||||||||||||
UNIQUE_ID (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
MULTIPLE_ID | ○ | ○ | ||||||||||||
Id Assignment Policy | ||||||||||||||
SYSTEM_ID (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||
USER_ID | ○ | ○ | ○ | ○ | ||||||||||
Servant Retention Policy | ||||||||||||||
RETAIN (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |
NON_RETAIN | ○ | |||||||||||||
Request Processing Policy | ||||||||||||||
USE_ACTIVE_OBJECT_MAP_ONLY (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||
USE_SERVANT_MANAGER | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
USE_DEFAULT_SERVANT | ○ | |||||||||||||
Implicit Activation Policy | ||||||||||||||
NO_IMPLICIT_ACTIVATION (既定値) | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
IMPLICIT_ACTIVATION | ○ | ○ |
module AddressMapping { typedef string<43> AM_MAP; typedef sequence<AM_MAP,10> AM_MAPS; interface AddressMap_1 { attribute unsigned long map_num; boolean add(in string name, in string phone); boolean search(in string name, out AM_MAP map); boolean delete(in string name); boolean list(out AM_MAPS maps); }; };
Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?1. は、アドレス帳の登録件数を表示します。
Please select number? 1 -------------------------- --> Get start. Get number of all maps = 52. は、アドレス帳への登録を行います。メッセージに応じて、名前と電話番号を入力してください。
Please select number? 2 -------------------------- --> Add start. name? sample1 phone? 111-1111 add() calling ..........OK.3. は、アドレス帳からの削除を行います。メッセージに応じて、名前を入力してください。
Please select number? 3 -------------------------- --> Delete start. name? sample1 delete() calling ..........OK.4. は、アドレス帳からの検索を行います。メッセージに応じて、名前を入力してください。
Please select number? 4 -------------------------- --> Search start. name? sample12_3 search() calling ..........OK. name / phone ------------------------------------------- sample12_3 / 333-33335. は、アドレス帳に登録されている情報を一覧表示します。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- Sample1 / 111-1111 Sample2 / 222-2222 Sample3 / 333-33336. は、現在保持しているオブジェクトリファレンスを文字列に変換したものを表示します。また、カレントディレクトリに "objref.dat" という名前のファイルを出力します。
Please select number? 6 -------------------------- --> Display start.(local) Object reference: IOR:000000000000002249444c3a416464726573734d61707069 6e672f416464726573734d61703a312e300000000000000100000000000000a0000100 00000000087072696d6572610004fc000000000088004e4f7262040100000000000000 002249444c3a416464726573734d617070696e672f416464726573734d61703a312e30 000000000000010000000000000000000000d08384d0880000003c00504f4101000000 000000072f6d79504f41000000000024004e504f41010000000000072f6d79504f4100 0000000000000000d08384d088000000007. は、新たにオブジェクトリファレンスを再取得します。
Please select number? 7 -------------------------- --> Obtain start.(local)
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA1
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_1 ===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = Thread-3] name = sample1, phone = 111-1111 ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = Thread-3] ===== AMapServant/list() end. quit. goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA2
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_2 ===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit! ===== AMapAdapterActivator/unknown_adapter() start. [Thread name = Thr ead-3] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapAdapterActivator/unknown_adapter() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample2, phone = 222-2222 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = Thread-3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA3
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_3 ===== AMapServer start. [Thread name = main] ===== myPOA created. If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapServer start. [Thread name = main] ===== myPOA created. If you want to stop ServerAP, key quit! ===== AMapServantActivator/incarnate() start. [Thread name = Thread-3] ===== AMapServant created. type: TRANSIENT ===== AMapServantActivator/incarnate() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample3, phone = 333-3333 ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = Thread-3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA4
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_4 ===== AMapServer start. [Thread name = main] ===== myPOA created. If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapServer start. [Thread name = main] ===== myPOA created. If you want to stop ServerAP, key quit! ===== AMapServantLocator/preinvoke() start. [Thread name = Thread-3] For add operation. ===== AMapServant created. type: TRANSIENT ===== AMapServantLocator/preinvoke() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample4, phone = 444-4444 ===== AMapServant/add() end. ===== AMapServantLocator/postinvoke() start. [Thread name = Thread-3] For add operation. ===== AMapServantLocator/postinvoke() end. ===== AMapServantLocator/preinvoke() start. [Thread name = Thread-3] For list operation. ===== AMapServant created. type: TRANSIENT ===== AMapServantLocator/preinvoke() end. ===== AMapServant/list() start. [Thread name = Thread-3] ===== AMapServant/list() end. ===== AMapServantLocator/postinvoke() start. [Thread name = Thread-3] For list operation. ===== AMapServantLocator/postinvoke() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA5
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_5 ===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient -name AMapObj2 ===== AMapClient started. ===== target = AMapObj2 -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample5 phone? 555-5555 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample5 / 555-5555サーバのメッセージから、初期化時にServant(DefaultServant)が生成され、クライアントからのリクエスト時にはそのServantが毎回対応していることが分かります。また、異なるオブジェクトリファレンスによるリクエストでも同じServantが対応しますので、2つのクライアントが同じアドレス帳を参照・更新していることが分かります。
===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = Thread-3] name = sample5, phone = 555-5555 ===== AMapServant/add() end. Connect request accepted ===== AMapServant/list() start. [Thread name = Thread-4] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA6
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_6 ===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample6 phone? 666-6666 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample6 / 666-6666サーバのメッセージから、ユーザが定義したAdapterActivator、ServantActivater、Servantがすべてperform_work()の延長、すなわちメインスレッドで実行されていることが分かります。また、別のクライアントからの要求も同じスレッドで実行されていることが分かります。
===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit! ===== AMapAdapterActivator/unknown_adapter() start. [Thread name = main] ===== myPOA created. ===== AMapAdapterActivator/unknown_adapter() end. ===== perform_work() start. ===== AMapServantActivator/incarnate() start. [Thread name = main] ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServantActivator/incarnate() end. ===== perform_work() end. ===== perform_work() start. ===== AMapServant/add() start. [Thread name = main] name = sample6, phone = 666-6666 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== perform_work() end. ===== perform_work() start. ===== AMapServantActivator/incarnate() start. [Thread name = main] ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServantActivator/incarnate() end. ===== perform_work() end. ===== perform_work() start. ===== AMapServant/list() start. [Thread name = main] ===== AMapServant/list() end. ===== perform_work() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA7
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_7 ===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample7 phone? 777-7777 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample7 / 777-7777サーバのメッセージから、ユーザが定義したAdapterActivator、ServantActivater、Servantがすべてメインスレッド以外で実行されていることが分かります。また、別のクライアントからの要求が異なるスレッドで実行されていることが分かります。
===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit! ===== AMapAdapterActivator/unknown_adapter() start. [Thread name = Thread-3] ===== myPOA created. ===== AMapAdapterActivator/unknown_adapter() end. ===== AMapServantActivator/incarnate() start. [Thread name = Thread-3] ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServantActivator/incarnate() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample7, phone = 777-7777 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServantActivator/incarnate() start. [Thread name = Thread-4] ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServantActivator/incarnate() end. ===== AMapServant/list() start. [Thread name = Thread-4] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA8
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_8 ===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit or refresh!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 6 -------------------------- --> Display start.(local) Object reference: IOR:000000000000002249444c3a416464726573734d61707069 6e672f416464726573734d61703a312e300000000000000100000000000000a0000100 00000000087072696d657261000488000000000088004e4f7262040100000000000000 002249444c3a416464726573734d617070696e672f416464726573734d61703a312e30 000000000000010000000000000000000000d082a60d300000003c00504f4101000000 000000072f6d79504f41000000000024004e504f41010000000000072f6d79504f4100 0000000000000000d082a60d3000000000サーバを再起動し、クライアント(B)でオブジェクトリファレンスを取得し、再度表示します。
Please select number? 7 -------------------------- --> Obtain start.(local) Please select number? 6 -------------------------- --> Display start.(local) Object reference: IOR:000000000000002249444c3a416464726573734d61707069 6e672f416464726573734d61703a312e300000000000000100000000000000a0000100 00000000087072696d657261000491000000000088004e4f7262040100000000000000 002249444c3a416464726573734d617070696e672f416464726573734d61703a312e30 000000000000010000000000000000000000d082a703480000003c00504f4101000000 000000072f6d79504f41000000000024004e504f41010000000000072f6d79504f4100 0000000000000000d082a7034800000000サーバを再起動する前と、再起動後に再取得したオブジェクトリファレンスが異なることが分かります。再取得前に古いオブジェクトリファレンスのままリクエストすると、以下のように例外が発生します。
Please select number? 5 -------------------------- --> List start. list() calling .....ERROR : org.omg.CORBA.OBJECT_NOT_EXIST[minor =5112, completed=MAYBE, reason=The object is not active] org.omg.CORBA.OBJECT_NOT_EXIST[minor=5112, completed=MAYBE, reason=The object is not active
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA9
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB -DServerPort=xxxx AMapServer_9 ===== AMapServer start. [Thread name = main] If you want to stop ServerAP, key quit or refresh!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample7 / 777-7777
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA10
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_10 ===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient -name AMapObj2 ===== AMapClient started. ===== target = AMapObj2 -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample10 phone? 101-0101 add() calling ..........OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling ..........OK. name / phone ------------------------------------------- sample10 / 101-0101サーバのメッセージから、初期化時にservant_to_reference()を使用するだけで暗黙のうちにServantは活性化されており、クライアントからのリクエスト時には明示的な活性の場合と同様に処理されることが分かります。また、異なるオブジェクトリファレンスによるリクエストでも同じServantが対応しますので、2つのクライアントが同じアドレス帳を参照・更新していることが分かります。
===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = Thread-3] name = sample10, phone = 101-0101 ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = Thread-3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA11
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB -DServerPort=xxxx AMapServer_11 ===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. ===== AMapServant's object reference created by servant_to_reference(). If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = Thread-3] name = sample11, phone = 111-1111 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/list() start. [Thread name = Thread-3] ===== AMapServant/list() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA12
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_12 ===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. If you want to stop ServerAP, key quit!
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
Please select number? 2 -------------------------- --> Add start. name? sample12_1 phone? 111-1111 add() calling ..........OK. Please select number? 2 -------------------------- --> Add start. name? sample12_2 phone? 222-2222 add() calling ..........OK. Please select number? 2 -------------------------- --> Add start. name? sample12_3 phone? 333-3333 add() calling ..........OK. Please select number? 2 -------------------------- --> Add start. name? sample12_4 phone? 444-4444 add() calling ..........OK. Please select number? 2 -------------------------- --> Add start. name? sample12_5 phone? 555-5555 add() calling .......... +------------------------------------------------------------- |※このリクエストにより擬似的な処理遅延で応答が15秒間、 | 遅れます。 +------------------------------------------------------------- OK.クライアント(C)から検索すると、(B)から登録した結果が表示されます。
Please select number? 5 -------------------------- --> List start. list() calling .......... +------------------------------------------------------------- |※Holding状態により、このリクエストはキューイングされ、 | 15秒間応答が遅れます。 +------------------------------------------------------------- OK. name / phone ------------------------------------------- sample12_1 / 111-1111 sample12_2 / 222-2222 sample12_3 / 333-3333 sample12_4 / 444-4444 sample12_5 / 555-5555サーバは、次のように動作します。
===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: PERSISTENT sleeped 15sec per 5actions. ===== Loading start. ===== Loading end. If you want to stop ServerAP, key quit! ===== AMapServant/add() start. [Thread name = Thread-3] name = sample12_1, phone = 111-1111 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample12_2, phone = 222-2222 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample12_3, phone = 333-3333 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample12_4, phone = 444-4444 ===== Saving start. ===== Saving end. ===== AMapServant/add() end. ===== AMapServant/add() start. [Thread name = Thread-3] name = sample12_5, phone = 555-5555 ===== Saving start. Holding(15sec.).....end. +------------------------------------------------------------- |※この間に受け付けたクライアント(C)からの要求は15秒間、 | 待たされます。 +------------------------------------------------------------- ===== AMapServant/list() start. [Thread name = Thread-4] ===== AMapServant/list() end. ===== Saving end. ===== AMapServant/add() end. quit goodbye... ===== AMapServer end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA13
> make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_1_tie ===== AMapServer start. [Thread name = main] ===== myPOA created. ===== AMapServant created. type: TRANSIENT If you want to stop ServerAP, key quit!
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\POA14
> make
> instimpl myImpl "C:\j2sdk1.4.2_10\bin\java -classpath C:\Progra~1\NEC\WebOTX\samples\corba\objava\POA14;C:\Progra~1\NEC\WebOTX\ObjectBroker\lib\ospiorb50.jar;C:\Progra~1\NEC\WebOTX\ObjectBroker\lib\ospiname50.jar;C:\Progra~1\NEC\WebOTX\ObjectBroker\lib\jsocks.jar -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapServer_14" SharedServer
Caution インプリメンテーションを登録するときにクラスパスを直接設定する場合には、ブランク文字を含まない形式でクラスパスを記述して下さい。ブランク文字を含むクラスパスを記述した場合、ブランクまでをクラスパスと判断し、自動起動サーバが正常に起動しない場合があります。
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB -DImplementationName=myImpl AMapServer_14 -create ===== AMapServer start. [Thread name = main] ===== myPOA created.
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB AMapClient ===== AMapClient started. ===== target = AMapObj -------------------------- Menu) 1.Get numbers of all. 2.Add address. 3.Delete address. 4.Search address. 5.List all. 6.Display object reference (& save to file:objref.dat). 7.Obtain object reference again. 9.End. Please select number?
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\hook > make
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB HookServer HookServer start. ORB init get NameService reference [SrvHook]Hook created.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\hook > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB HookClient
HookServer start. ORB init get NameService reference [SrvHook]Hook created. [SrvHook]ServerAfterReceive() for message called. 47 49 4F 50 01 00 00 00 00 00 00 B0 00 00 00 01 G I O P . . . . . . . . . . . . 00 00 00 01 00 00 00 0C 00 00 00 00 00 01 00 01 . . . . . . . . . . . . . . . . [SrvHook]ServerAfterReceive() for parameter called. [SrvHook] operation: op1 [SrvHook] arg1's value = 1 op1() called. [SrvHook]ServerBeforeSend() for parameter called. [SrvHook] operation: op1 [SrvHook]ServerBeforeSend() for message called. 47 49 4F 50 01 00 00 01 00 00 00 20 00 00 00 01 G I O P . . . . . . . . . . . 00 00 00 01 00 00 00 0C 00 00 00 00 00 01 00 01 . . . . . . . . . . . . . . . . [SrvHook]ServerAfterReceive() for message called. 47 49 4F 50 01 00 00 00 00 00 00 B0 00 00 00 01 G I O P . . . . . . . . . . . . 00 00 00 01 00 00 00 0C 00 00 00 00 00 01 00 01 . . . . . . . . . . . . . . . . [SrvHook]ServerAfterReceive() for parameter called. [SrvHook] operation: stop stop() called. HookServer end.クライアント側のウィンドウは、次のように表示されます。
HookClient start. ORB init get NameService reference [CltHook]Hook created. op1() call [CltHook]ClientBeforeSend() for parameter called. [CltHook] operation: op1 [CltHook] arg1's value = 1 [CltHook]ClientBeforeSend() for message called. 47 49 4F 50 01 00 00 00 00 00 00 B0 00 00 00 01 G I O P . . . . . . . . . . . . 00 00 00 01 00 00 00 0C 00 00 00 00 00 01 00 01 . . . . . . . . . . . . . . . . [CltHook]ClientAfterReceive() for message called. 47 49 4F 50 01 00 00 01 00 00 00 20 00 00 00 01 G I O P . . . . . . . . . . . 00 00 00 01 00 00 00 0C 00 00 00 00 00 01 00 01 . . . . . . . . . . . . . . . . [CltHook]ClientAfterReceive() for parameter called. [CltHook] operation: op1 done. stop() call done. HookClient end.
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\value1 > makeサーバプログラムを実行します。
> java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Val1Server別のコマンドプロンプトを開き、クライアントプログラムを実行します。
> cd C:\Program Files\NEC\WebOTX\samples\corba\objava\value1 > java -Dorg.omg.CORBA.ORBClass=jp.co.nec.orb.OSPORB Val1Client
図1.1.4.23-1
図1.1.4.23-2
図1.1.4.23-3
図1.1.4.23-4