Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
|
目次
索引

|
6.17.5 AdapterActivator使用例 (find_POA時)
(1)IDL定義
module ODsample{
interface intf1{
attribute string value;
};
interface intf2{
readonly attribute long value;
void add( in long a );
void sub( in long b );
};
interface Factory {
intf1 create1 ();
intf2 create2 ();
void destroy1( in intf1 obj );
void destroy2( in intf2 obj );
};
};
(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -a Imple_POAsample9 -n ODsample::POAsample9
(3)アプリケーション構成概要図

(4)クライアントアプリケーション
import java.io.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import ODsample.*;
public class Client {
public static void main( String args[] ) {
try {
// ORBの生成と初期化
ORB Orb = ORB.init( args, null );
// ネーミングサービスのオブジェクトリファレンスの取得
org.omg.CORBA.Object _tmpObj =
Orb.resolve_initial_references( "NameService" );
NamingContext Cos = NamingContextHelper.narrow( _tmpObj );
// ネーミングサービスのresolveメソッドを発行し、
// サーバアプリケーションのオブジェクトリファレンスの獲得
String NCid =
new String( "ODsample::POAsample9" ); // オブジェクト名
String NCkind = new String( "" ); // オブジェクトタイプ
NameComponent nc = new NameComponent( NCid, NCkind );
NameComponent NCo[] = { nc };
org.omg.CORBA.Object Obj = Cos.resolve( NCo );
int in = 0; // inパラメタ用変数
String line = null;
// Factoryのオブジェクトリファレンス獲得
Factory target = FactoryHelper.narrow( Obj );
// Factoryでインタフェース1用オブジェクトリファレンスを作成する
intf1 _intf1 = target.create1();
// サーバアプリケーションのメソッド呼出し
System.out.println( "String = " + _intf1.value() );
System.out.print( "String => " );
line = new BufferedReader( new InputStreamReader( System.in ) ).readLine();
// サーバアプリケーションのメソッド呼出し
_intf1.value( line );
System.out.println( "String = " + _intf1.value() );
// インスタンスの解放
target.destroy1( _intf1 );
// Factoryでインタフェース2用オブジェクトリファレンスを作成する
intf2 _intf2 = target.create2();
try {
// サーバアプリケーションのメソッド呼出し
System.out.println( "value = " + _intf2.value() );
System.out.print( "add => " );
line =
new BufferedReader( new InputStreamReader( System.in ) ).readLine();
in = Integer.parseInt( line );
// サーバアプリケーションのメソッド呼出し
_intf2.add( in );
System.out.println( "value = " + _intf2.value() );
System.out.print( "sub => " );
line =
new BufferedReader( new InputStreamReader( System.in ) ).readLine();
in = Integer.parseInt( line );
// サーバアプリケーションのメソッド呼出し
_intf2.sub( in );
System.out.println( "value = " + _intf2.value() );
// インスタンスの解放
target.destroy2( _intf2 );
}
catch ( java.lang.NumberFormatException e ){
System.exit( 255 );
}
}
catch( org.omg.CORBA.SystemException se ) {
System.out.println( "ERROR : " + se.getClass().getName()
+ " : minor = 0x" + java.lang.Integer.toHexString(se.minor) );
System.exit( 255 );
}
catch( org.omg.CORBA.UserException ue ) {
System.out.println( "ERROR : " + ue.getClass().getName() );
System.exit( 255 );
}
catch ( Exception e ) {
System.err.println( "ERROR : " + e );
System.exit( 255 );
}
}
}
(5)サーバアプリケーション
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import ODsample.*;
// ユーザアプリケーション:メイン処理クラス
public class Server {
public static void main( String args[] ) {
try {
// ORBの生成と初期化
ORB Orb = ORB.init( args, null );
// RootPOAのオブジェクトリファレンスの取得
org.omg.CORBA.Object _tmpObj =
Orb.resolve_initial_references( "RootPOA" );
// RootPOAのPOAオブジェクト獲得
POA rootPOA = POAHelper.narrow( _tmpObj );
// Factoryインタフェース用のPOA作成
// ポリシリスト作成
org.omg.CORBA.Policy factory_policies[] = new org.omg.CORBA.Policy[4];
factory_policies[0] = rootPOA.create_servant_retention_policy(
ServantRetentionPolicyValue.NON_RETAIN );
factory_policies[1] = rootPOA.create_request_processing_policy(
RequestProcessingPolicyValue.USE_DEFAULT_SERVANT );
factory_policies[2] = rootPOA.create_id_assignment_policy(
IdAssignmentPolicyValue.SYSTEM_ID );
factory_policies[3] = rootPOA.create_id_uniqueness_policy(
IdUniquenessPolicyValue.MULTIPLE_ID );
POA factory_POA = rootPOA.create_POA( "IDL:ODsample/Factory:1.0",
null,
factory_policies);
// FactoryServantの生成(コンストラクタにインプリ用POAを渡す)
Servant svt = new FactoryServant( rootPOA );
// Factoryインタフェース用POAのDefault Servantに設定
factory_POA.set_servant( svt );
// AdapterActivatorの生成
AdapterActivator adp = new UserAdapterActivator();
// インプリ用POAのAdapterActivatorに設定
rootPOA.the_activator( adp );
// POAマネージャの獲得
POAManager poamanager = rootPOA.the_POAManager();
// POAマネージャのactivate
poamanager.activate();
Orb.run();
}
catch( org.omg.CORBA.SystemException se ) {
System.out.println( "ERROR : " + se.getClass().getName()
+ " : minor = 0x" + java.lang.Integer.toHexString(se.minor) );
System.exit( 255 );
}
catch( org.omg.CORBA.UserException ue ) {
System.out.println( "ERROR : " + ue.getClass().getName() );
System.exit( 255 );
}
catch ( Exception e ) {
System.err.println( "ERROR : " + e );
System.exit( 255 );
}
}
}
// FactoryServant:Factoryメソッド実装クラス(スケルトンを継承)
class FactoryServant extends FactoryPOA {
private POA poa = null;
// コンストラクタ
public FactoryServant( POA poa ) {
this.poa = poa;
}
public intf1 create1() {
intf1 ior; // UserServantのオブジェクトリファレンス
try {
// インタフェースリポジトリIDに対応するのPOAオブジェクト獲得
POA intf1POA = this.poa.find_POA( "intf1", true );
// オブジェクトリファレンスの生成
org.omg.CORBA.Object _tmpObj = intf1POA.create_reference(
"IDL:ODsample/intf1:1.0" );
ior = intf1Helper.narrow( _tmpObj );
}
catch( org.omg.CORBA.UserException e ) {
System.err.println( "create error: " + e );
return( null );
}
return( ior );
}
public intf2 create2() {
intf2 ior; // UserServantのオブジェクトリファレンス
try {
// インタフェースリポジトリIDに対応するのPOAオブジェクト獲得
POA intf2POA = this.poa.find_POA( "intf2", true );
// オブジェクトリファレンスの生成
org.omg.CORBA.Object _tmpObj = intf2POA.create_reference(
"IDL:ODsample/intf2:1.0" );
ior = intf2Helper.narrow( _tmpObj );
}
catch( org.omg.CORBA.UserException e ) {
System.err.println( "create error: " + e );
return( null );
}
return( ior );
}
public void destroy1( intf1 obj ) {
try {
// インタフェースIDに対応するのPOAオブジェクト獲得
POA intf1POA = this.poa.find_POA( "intf1", false );
// オブジェクトリファレンスからオブジェクトIDを求める
byte oid[] = intf1POA.reference_to_id( obj );
// Servantをdeactiveにする
intf1POA.deactivate_object( oid );
}
catch( org.omg.CORBA.UserException e ) {
System.err.println( "destroy error: " + e );
}
}
public void destroy2( intf2 obj ) {
try{
// インタフェースIDに対応するのPOAオブジェクト獲得
POA intf2POA = this.poa.find_POA( "intf2", false );
// オブジェクトリファレンスからオブジェクトIDを求める
byte oid[] = intf2POA.reference_to_id( obj );
// Servantをdeactiveにする
intf2POA.deactivate_object( oid );
}
catch( org.omg.CORBA.UserException e ) {
System.err.println( "destroy error: " + e );
}
}
}
// アダプタアクティベータ:POA生成クラス(AdapterActivatorを継承)
// JDK/JRE1.4を使用する場合
//class UserAdapterActivator extends LocalObject implements AdapterActivator {
// JDK/JRE1.3以前を使用する場合
class UserAdapterActivator extends AdapterActivator {
public boolean unknown_adapter( POA parent, String name ) {
// ポリシリスト作成
org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4];
policies[0] = parent.create_servant_retention_policy(
ServantRetentionPolicyValue.RETAIN );
policies[1] = parent.create_request_processing_policy(
RequestProcessingPolicyValue.USE_SERVANT_MANAGER );
policies[2] = parent.create_id_assignment_policy(
IdAssignmentPolicyValue.SYSTEM_ID );
policies[3] = parent.create_id_uniqueness_policy(
IdUniquenessPolicyValue.MULTIPLE_ID );
// ServantActivatorの生成
ServantActivator svtact = new UserServantActivator();
try {
if( name.equals( "intf1" ) ) {
// intf1用のPOA作成
POA intf1POA = parent.create_POA( name, null, policies );
// ServantManager登録
intf1POA.set_servant_manager( svtact );
return( true );
}
else if( name.equals( "intf2") ) {
// intf2用のPOA作成
POA intf2POA = parent.create_POA( name, null, policies );
// ServantManager登録
intf2POA.set_servant_manager( svtact );
return( true );
}
}
catch( Exception e ) {
System.err.println( "unknown_adapter error: " + e );
return( false );
}
return( true );
}
}
// Servantアクティベータ:Servant生成クラス(ServantActivatorを継承)
// JDK/JRE1.4を使用する場合
// class UserServantActivator extends LocalObject implements ServantActivator {
// JDK/JRE1.3以前を使用する場合
class UserServantActivator extends ServantActivator {
public Servant incarnate( byte[] oid, POA adapter ) {
Servant svt = null;
if ( adapter.the_name().equals( "intf1") )
svt = new UserServant1();
else if ( adapter.the_name().equals( "intf2") )
svt = new UserServant2();
return( svt );
}
public void etherealize( byte[] oid,
POA adapter,
Servant serv,
boolean cleanup_in_progress,
boolean remaining_activations ) {
// 変数の初期化を行う。
serv = null;
}
}
// Servant:メソッド実装クラス(スケルトンを継承)
class UserServant1 extends intf1POA {
private String value = "";
public java.lang.String value() {
return( this.value );
}
public void value( java.lang.String value ) {
this.value = value;
}
}
class UserServant2 extends intf2POA {
private int value = 0;
public int value() {
return( this.value );
}
public void add( int a ) {
this.value += a;
}
public void sub( int b ) {
this.value -= b;
}
}
(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法は、クライアントアプリケーションの例外処理と同様です。詳細については、“クライアントアプリケーションの例外処理”を参照してください。
Copyright 2006 FUJITSU LIMITED