その他の考慮事項

内容
casp1032jp
内容
 
分散環境
別のワークステーションからクライアントを実行する際に必要なファイルと設定が存在することを確認する場合は、以下のチェックリストを使用します。
  • SpectroSERVER
     でのユーザ作成
  • 適切な .hostrc 権限
  • DNS または /etc/hosts のからのホスト名の解決
  • クライアントとサーバ間のすべてのルータのアクセス制御リスト
  • ファイアウォール ブロッキング ポート
注:
分散
SpectroSERVER
 環境の設定に関する詳細については、「」を参照してください。
ロケーション サービス インターフェース
分散環境の
SpectroSERVER
 のリストを取得する場合は、CsCLocServMapInt インターフェースを使用できます。ロケーション サービスはこのインターフェースでアドバタイズします。
SpectroSERVER
 リストを取得するために呼び出せるのは 1 回のみです。CsCModelDomain インターフェース参照が取得されると、isPrimary メソッドが呼び出され、インターフェースがプライマリであるか、セカンダリであるかが判別されます。
注:
isPrimary メソッドの呼び出しは、フォールト トレラント環境において、
SpectroSERVER
 がプライマリであるか、セカンダリであるかを知る 1 つの方法です。
複数ドメインへのバインド例
以下の例は、複数ドメインのバインディング メソッドを示しています。
import java.io.*; import com.aprisma.spectrum.core.idl.*; import com.aprisma.spectrum.core.util.*; import com.aprisma.spectrum.core.idl.CsCException.*; import com.aprisma.spectrum.core.idl.CsCModelDomainPackage.*; import com.aprisma.spectrum.core.idl.CsCError.*; import com.aprisma.util.corba.*; public class GetDomainList { public static void main(String[] args) { CsCorbaValueHelper help = new CsCorbaValueHelper(); CsCLocServMapInt locserv; CORBAHelper helper = null; String[] domainnames = { "" }; CsCModelDomain[] md; helper = CORBAHelper.getHelperImpl(); try { String domainName = new String("mySpectroSERVER"); helper.init(null, null); locserv = (CsCLocServMapInt)helper.getObjectImplementation( CsCLocServMapInt.class, domainName); domainnames = locserv.getModelDomainNameList(); } catch (Throwable e) { System.out.println(e); } md = new CsCModelDomain[domainnames.length]; for (int i = 0; i < domainnames.length; i++) { try { md[i] = (CsCModelDomain)helper.getObjectImplementation( CsCModelDomain.class, domainnames[i]); System.out.println("Name:" + domainnames[i]); System.out.println("Is Primary: " + md[i].isPrimary()); } catch (Throwable e) { System.out.println(e); } } } }
この例では、以下のオブジェクトとメソッドが必要です。
  • パッケージ com.aprisma.spectrum.core.idl
    • インターフェース
      • CsCLocServMapInt
      • CsCModelDomain
    • クラス
      • CsCLocServMapIntHelper
      • CsCModelDomainHelper
  • パッケージ com.aprisma.spectrum.core.idl.CsCError
    • クラス
      • CsCError_e
CORBA インターフェースのステータス監視
ModelDomain、AlarmDomain および EventDomain などの永続インターフェースの場合を除き、サーバ バウンスが原因で非永続インターフェースおよびウォッチ参照が失われる可能性があります。CORBAObjectMonitor では、ドメインが失われてから接続が再確立されたかどうかを認識する機能が提供されます。utilsrvXX.jar にある CORBAObjectMonitor がインスタンス化された場合、アプリケーション ユーザを介してドメインにバインドします。
CORBA インターフェースのステータスを監視するには、以下のコンポーネントが必要です。
  • ドメインをポーリングする CORBAObjectMonitor。
  • CORBAObjectMonitor で検出された接続変更に対応する CORBAObjectMonitorListener。
CORBAObjectMonitor は、呼び出される CORBAObjectMonitorListener メソッドにリスナを追加します。CORBAObjectMonitorListener には以下のメソッドがあります。
  • connectionError
  • connectionEstablished
  • connectionLost
  • successfullyPolled
この例では、以下のオブジェクトとメソッドが必要です。
  • パッケージ com.aprisma.spectrum.core.idl
    • インターフェース
      • CsCModelDomain
    • クラス
      • CsCModelWatchCBImplBase
      • CsCModelDomainHelper
  • パッケージ com.aprisma.spectrum.core.idl.CsCError
    • クラス
      • CsCError_e
  • パッケージ com.aprisma.util.corba
    • インターフェース
      • CORBAObjectMonitorListener
    • クラス
      • CORBAObjectMonitor
CORBA インターフェースのステータスを監視する方法
CORBA インターフェースを監視するには、以下のプロセスをが必要です。
  1. PersistentWatcher クラスは、CORBAObjectMonitorListener を実装します。
  2. コンストラクタは必要なドメイン(この場合は、CsCModelDomain)を取得するために呼び出しを行い、その参照を変数に設定します。CORBAObjectMonitor が作成されます。渡される引数は、サービス名、サービス タイプ、およびポーリング間隔(ミリ秒単位)です。
  3. オブジェクト実装を取得するモニタで接続するための呼び出しが行われます。接続がすでに確立されている場合は、オブジェクトが返されます。接続されておらず、tryToConnect が True に設定されている場合には、接続が再試行されます。
  4. 接続が良好の場合は、リスナを追加して、ポーリングを開始します。
  5. startPolling() を呼び出すと、CORBA オブジェクトがまだ存在するかどうかの確認が行われます。存在する場合は、successfullyPolled メソッドが呼び出されます。存在しない場合は、接続が再試行されます。
  6. 接続が成功すると、connectionEstablished メソッドが呼び出されます。接続試行が失敗した場合は、問題に応じて、connectionLost または connectionError が呼び出されます。
    注:
    フォールト トレラント環境では、プライマリが失敗した場合、CORBAObjectMonitor はセカンダリの監視を試行します。成功した場合、connectionEstablished メソッドが呼び出されます。監視オブジェクトがセカンダリに接続できない場合は、connectionLost または connectionError が呼び出されます。
    以下の CORBAObjectMonitorListener メソッドでは通知が必要です。
    • successfullyPolled
      接続が正常にポーリングされたときに呼び出されるリスナ メソッドを示します。
    • connectionEstablished
      接続が成功した場合に呼びされれるリスナ メソッドを示します。
    • connectionLost
      接続が成功せず、CORBA フレームワークに問題がある場合に呼び出されるリスナ メソッドを示します。
    • connectionError
      接続が成功せず、CORBA フレームワークの外部に問題がある場合に呼び出されるリスナ メソッドを示します。
  7. コンストラクタでの最終呼び出しで、モデルのウォッチが設定されます。リスナでの各トリガに対して、アクションが実行されます。接続切断および接続エラーが発生した場合は、接続がダウンしていることをユーザに通知するメッセージが表示されます。接続が確立した場合は、モデルのウォッチが再確立されます。
CORBA インターフェース ステータスの監視例
以下の例は、インターフェースを監視する方法を示しています。
import java.io.*; public class PersistentWatcherApp { public static void main( String[] args ) { String serverName = new String( "mySpectroSERVER" ); String userName = new String( "user" ); Integer mtID = Integer.decode( args[0] ); PersistentWatcher pw = new PersistentWatcher( serverName, userName, mtID.intValue() ); } } import java.util.*; import com.aprisma.spectrum.core.idl.CsCError.*; import com.aprisma.spectrum.core.idl.*; import com.aprisma.spectrum.core.util.*; import com.aprisma.spectrum.core.idl.CsCException.*; import com.aprisma.util.corba.*; /** * This class implements the CORBAObjectMonitorListener but is also * responsible for connecting to the server and establishing the * watching of the Model Domain. */ public class PersistentWatcher implements CORBAObjectMonitorListener { int mt_id; // Objects needed throughout the program CsCModelDomain modelDomain = null; CORBAObjectMonitor monitor = null; /** Constructs the PersistentWatcher */ public PersistentWatcher( String servername, String username, int modelTypeid) { this.mt_id = modelTypeid; getServerModelDomain( servername, username ); // Setup CORBA Monitor monitor = new CORBAObjectMonitor ( servername, CsCModelDomain.class, 20000); // 20 seconds // Check to see if the monitor has a connection if start the // setup the model watch and start to monitor if ( monitor.connect ( true ) != null ) { monitor.addListener( this ); monitor.startPolling(); setupModelWatch(); System.out.println("Press Enter to exit"); try { System.in.read(); } catch ( Exception e ) { System.out.println( e ); } } else { System.out.println("Monitor could not connect." + "Not Watching"); } } /** This method is responsible obtaining the SERVER's model domain. */ private void getServerModelDomain( String server, String username ) { try { CORBAHelper helper = CORBAHelper.getHelperImpl() ; helper.init(null,null); modelDomain = (CsCModelDomain) helper.getObjectImplementation ( CsCModelDomain.class, server); } catch ( Throwable e ) { System.out.println ( "Could not find server"); System.out.println ( e ) ; } } /** This method is responsible creating the model watch on the model domain. */ private void setupModelWatch() { try { int[] mtypeIDs = { mt_id }; CORBAHelper helper = CORBAHelper.getHelperImpl(); ModelCallback callback = new ModelCallback(); CsCModelWatchCB cb = CsCModelWatchCBHelper.narrow( helper.servant_to_reference(callback)); modelDomain.startWatchModelsByTypeIDs(mtypeIDs, cb); } catch ( Exception e ) { System.out.println ( "Could not find server"); System.out.println ( e ) ; } } /** Interface CORBAObjectMonitorListener This method is Invoked when the connection has been lost. */ public void connectionLost ( String objectName, Class idlInterfaceClass ) { System.out.println ("Watch and Connection Lost"); } /** Interface CORBAObjectMonitorListener This method is Invoked when a connection fails for some reason other than object */ public void connectionError ( String objectName, Class idlInterfaceClass, Throwable e ) { System.out.println ("Error"); } /** Interface CORBAObjectMonitorListener This method is Invoked when the connection has been established. */ public boolean connectionEstablished ( org.omg.CORBA.Object object, String objectName, Class idlInterfaceClass ) { setupModelWatch(); System.out.println ( "Re-established Watch and Connection"); return true; } /** Interface CORBAObjectMonitorListener This method is Invoked when the object is polled successfully. */ public void successfullyPolled( org.omg.CORBA.Object object, String objectName, Class idlInterfaceClass ) { System.out.println ( "Successful Poll" ); }
フォールト トレラント環境
フォールト トレラント環境では、セカンダリ サーバの書き込みや更新は行わないでください。サーバからデータを取得して、クライアント アプリケーションのステータスを知ることができます。オンライン バックアップを使用して、プライマリからセカンダリにすべてのデータを更新することをお勧めします。
プライマリからセカンダリに切り替えると、ネーミング サービスはセカンダリから新しいアドバタイズをシームレスに受信します。プライマリであるか、セカンダリであるかを確認するには、CSCModelDomain から isPrimary メソッドを呼び出します。CORBA オブジェクト監視を介して切り替えを判別することもできます。
フォールト トレラント環境で SpectroSERVER からサービス オブジェクトを取得する最適な方法は、CORBAHelper クラスから以下の API を使用することです。
/** * Obtains the implementation for the given object name. * * @param IDLClass the class of the object as defined in the IDL. * @param objectName the name of the object's implementation * @return the implementation object or an exception on failure. */ public org.omg.CORBA.Object getObjectImplementation( Class IDLClass, String objectName ) throws Throwable
このメソッドで正しいサーバ(プライマリまたはセカンダリ)からオブジェクトが取得されます。内部的には、まず、ロケーション サーバからドメイン階層のマップを取得し、次に、ドメイン階層のホストからオブジェクトの取得を試み、見つかったオブジェクトを返します。
以下のメソッドを使用して、サービス オブジェクトを取得することもできますが、SpectroSERVER のプライマリ/セカンダリ ホスト名を指定する必要があります。
/** * Obtains the implementation for the given object name. * * @param IDLClass the class of the object as defined in the IDL. * @param objectName the name of the object's implementation * @param host the host to connect to. * @param enableReconnect determines whether to automatically * re-connect if the current connection is broken. * The implementation may not support this * option. * @return the implementation object or an exception on failure. */ public org.omg.CORBA.Object getObjectImplementation( Class IDLClass, String objectName, String host, boolean enableReconnect ) throws Throwable ;
たとえば、セカンダリからサービス オブジェクトを取得する場合、そのホストはセカンダリのホスト名である必要があります。
プライマリおよびセカンダリの両方のホスト名を指定できる次のようなメソッドもあります。このメソッドでは正しいサーバからオブジェクトが返されます。
public org.omg.CORBA.Object getObjectImplementation( Class IDLClass, String objectName, String[] hostList, boolean enableReconnect ) throws Throwable ;
サービスがプライマリのものであるか、セカンダリのものであるかを気にせずに、ドメイン ID を取得できる例を以下に示します。
try { String domainName = "myLandscape"; // Construct helper CORBAHelper helper = CORBAHelper.getHelperImpl(); if ( helper.init(null, null) ) { CsCModelDomain md = (CsCModelDomain) helper.getObjectImplementation( CsCModelDomain.class, domainName ); int id = md.getModelDomainID(); System.out.println( "0x" + Integer.toHexString(id) ); } } catch(Throwable e) { e.printStackTrace(); }
パフォーマンスの問題
古いメソッド呼び出しを新しいメソッド呼び出しに更新することにより、アプリケーションのパフォーマンスを向上できます。このドキュメントのすべての例では新しい呼び出しを使用します。古いメソッド呼び出しでは、IP パケットを通過するときにインターフェースの負荷が増える大きなデータ オブジェクトを使用します。新しいメソッド呼び出しでは基本型を使用して、データ サイズを最小化し、速度を向上させます。
API のパフォーマンスの 2 つの主な要因は、速度とメモリ使用率です。速度を向上させるには、以下の点を考慮してください。
  • 関係するモデルの数はどれくらいか。
  • モデルに対して行う呼び出しと、それらの呼び出しが同じであるかどうか。
  • データの読み取りまたは書き込みを行う場合、関係する属性の数はどれくらいか。
  • メソッドを繰り返すかどうかと、繰り返す場合は、モデル ID のリストを使用して、1 回の呼び出しに置き換えることができるかどうか。
  • すべてのデータの読み取りまたは書き込みを行う必要があるか。
  • すべての属性の読み取りと書き込みをグループ化できるか。
  • 検索する場合、検索範囲が広すぎないかどうか。
属性を書き込む必要があるモデル ID のリストがある場合は、個別の呼び出しで各 ID を反復するのではなく、完全なリストを渡します。
メモリ使用率を向上させるために、作業を過剰にグループ化しないようにしてください。大きなモデル グループ要求が原因で、SpectroSERVER 側の大容量メモリが増える場合があります。たとえば、ルート テーブルを読み取る場合は、テーブル全体を一度に読み取らないでください。CsCOIDSpec クラスを使用して、読み取り要求を分割し、範囲を設定します。一度に 500 を超えるモデルを渡すことはできません。
注:
これらの推奨事項に従ってもパフォーマンスの問題が続く場合は、CA サポートにお問い合わせください。
クライアント アプリケーションのデバッグ
クライアント アプリケーションの詳細なデバッグを有効にするには、以下のコードを使用します。
Properties props = new Properties () ; props.put("ORBwarn", "2"); CORBAHelper helper = CORBAHelper.getHelperImpl(); helper.init(null, props); CsCModelDomain md = (CsCModelDomain) helper.getObjectImplementation (CsCModelDomain.class, "myWorkstation" );