サーバアプリケーションを記述するために必要な以下の項目を説明します。
サーバアプリケーションの構造
サーバアプリケーションの入出力情報
クライアントアプリケーションへの復帰値
サーバアプリケーションプロセスの形態
サーバアプリケーションの構造
一般のアプリケーションは、前処理、本処理、後処理という3つの構成で成り立っています。前処理として行う処理は、使用するデータベースの接続処理やデータベースのオープン処理などです。後処理として行う処理は、接続中データベースの切断処理やオープン中データベースのクローズ処理などです。前処理および後処理で行うことは、使用するデータベース管理システムごとに決まっています。そのため、Interstageでは前出口プログラムおよび後出口プログラムの機能を提供します。
スケルトンを使用することにより、サーバアプリケーション開発者は、本処理だけを開発することで、サーバアプリケーションの作成が可能となります。
サーバアプリケーションの構造を以下に示します。
なお、データベース管理システムが提供するトランザクションを使用する場合には、サーバアプリケーション自身がデータベースとの接続や切断処理を行う必要があります。このような前処理および後処理を、出口プログラムとして本処理部分とは別に作成することができます。
この出口プログラムを作成することで、データ処理ごとに行っていたデータベースとの接続や切断処理を出口プログラムで行うことができるようになるため、効率の良い処理を構築することができます。
データベース管理システムが提供するトランザクションを使用する場合の、サーバアプリケーションの構造を以下に示します。
スケルトンとサーバアプリケーションの関係は、主プログラムと副プログラムという関係となります。また、サーバアプリケーションはスケルトンと静的結合により実行されます。スケルトンとサーバアプリケーションの関係について以下に示します。
サーバアプリケーションと、一般のアプリケーションとの違いを以下に示します。
副プログラムとして作成する必要があります。
スレッドに関する命令は記述できません。
実行プログラムは、スケルトンと静的結合した実行形式プログラムとする必要があります。
シグナルに関する命令は記述できません。
前出口プログラムは、ワークユニット起動時にアプリケーションプロセス単位で実行され、後出口プログラムは、ワークユニット停止時にアプリケーションプロセス単位で実行されます。ただし、ワークユニット強制停止時およびワークユニット異常終了時は、後出口プログラムは実行されません。
このとき、前出口プログラムおよび後出口プログラムの復帰値が0の場合は正常、0以外の場合は異常とします。復帰値が0以外の場合、ワークユニット起動時では、ワークユニットの起動失敗となり、ワークユニット停止時では、警告メッセージを出力し、ワークユニット停止処理は正常に終了します。
また、サーバアプリケーションの前処理、後処理の復帰値はすべてlong型にする必要があります。
以下の処理はInterstageが行うため、サーバアプリケーションで考慮する必要はありません。
CORBAの初期化メソッドの呼び出し
メソッドの登録
サーバの活性化/非活性化
ただし、サーバアプリケーションが例外を使用する場合は、CORBAの初期化メソッドの呼び出しが必要です。
サーバアプリケーションは、クライアントからの呼び出し時に、スケルトンを経由して、IDLで定義した入力インタフェースで呼び出されます。また、サーバアプリケーションの処理が完了すると、スケルトンを経由してIDLで定義した出力インタフェースがクライアントに返却されます。
サーバアプリケーションの動作概要を以下に示します。
サーバアプリケーションの入出力インタフェースはCORBAで規定されています。CORBAのデータ型と言語とのマッピングを以下に示します。
CORBAデータ型 | 型宣言 | ||
---|---|---|---|
基本データ型 | 整数型 | ・long long | ・CORBA::LongLong |
浮動小数点型 | ・float | ・CORBA::Float | |
文字型 | ・char | ・CORBA::Char | |
オクテット | ・octet | ・CORBA::Octet | |
ブーリアン | ・boolean | ・CORBA::Boolean | |
文字列型 | ・string | ・CORBA::Char* | |
構造データ型 | 構造体 | ・struct | ――――――― |
配列 | ――――――― | ――――――― | |
シーケンス | ・sequence | ――――――― |
サーバアプリケーションからスケルトンに、outパラメタまたはinoutパラメタのstring型のデータを受け渡す場合はTD::string_alloc、wstring型のデータを受け渡す場合はTD::wstring_allocにより領域を獲得する必要があります。また、string、wstring型データおよび構造データ型の場合には、サーバのアプリケーション用APIを利用する必要があります。サーバのアプリケーション用APIの詳細は、C++の提供クラスを参照してください。
なお、サーバアプリケーションでは、コンテキスト情報を使用することはできません。サーバアプリケーションに対しては、第1引数と最後の引数でシステムパラメタ、第2引数以降IDLで定義したパラメタというインタフェースでデータの入出力を行います。
また、IDL定義にoutパラメタを定義している場合、サーバアプリケーションが処理を終了する際には、必ずoutパラメタに復帰データを設定しなければなりません。outパラメタに復帰データが設定されていない場合、サーバアプリケーションプロセスが異常終了することがあります。
クライアントアプリケーションへの復帰値は、Interstageにより規定されています。
復帰値 | 意味 | アプリケーションの指定可否 |
---|---|---|
0~10000 | サーバアプリケーション任意 | 可 |
10001 | システム異常検出(メモリ不足等) | 不可 |
10002 | システムで異常検出 | 不可 |
| AIM連携のホスト間通信処理で異常検出 | 不可 |
10004 | 以下のいずれかの異常を検出
| 不可 |
| AIM連携のセション継続機能において異常検出 | 不可 |
10006 | アクセス権がないユーザからの要求 | 不可 |
10007 | プロセスバインド機能において異常検出(注) | 不可 |
10008 | 最大キューイング数に達した | 不可 |
(注)IPCOMによる負荷分散を行っている環境でプロセスバインド機能を使用した場合にも復帰します。
クライアントアプリケーションとサーバアプリケーションで任意に使用することができます。Interstageはこれらの復帰値を正常とみなします。
Interstageがクライアントに通知する復帰値であり、システムで異常が検出されたことを意味します。クライアントに復帰値10001~10008が通知された場合は、同時にその異常の詳細がエラーログに記録されます。
また、復帰値が10004で、エラーログに詳細が出力されていない場合は、クライアントから呼び出したオペレーションが、サーバのスケルトンに定義されていない(上記表の「オペレーション名が不当」に該当する)可能性があります。クライアントのスタブとサーバのスケルトンが同一のIDL定義から生成されているか、不一致がないかを確認してください。
なお、エラーログは、以下のファイルに採取されます。エラーログの内容については“メッセージ集”の“コンポーネントトランザクションサービスが出力するログメッセージ”を参照してください。
INTERSTAGEインストールフォルダ\td\trc\lorb\errlog0 INTERSTAGEインストールフォルダ\td\trc\rorb\errlog0 |
/var/opt/FSUNtd/trc/lorb/errlog0 /var/opt/FSUNtd/trc/rorb/errlog0 |
/var/opt/FJSVtd/trc/lorb/errlog0 |
クライアントアプリケーションでは、復帰値を参照する前に例外を判定する必要があります。例外が発生している場合は、復帰値は不定となります。クライアントアプリケーションでの例外処理については、“アプリケーション作成ガイド(CORBAサービス編)”を参照してください。
サーバアプリケーションプロセスの形態
サーバアプリケーションプロセスには以下の2つの形態があります。
サーバアプリケーションプロセスがマルチスレッドで動作する形態です。ただし、サーバアプリケーションはプライマリスレッド上でのみ動作し、マルチスレッドでは動作しません。スレッドモードではInterstageの制御用スレッドが複数起動します。
通常はスレッドモードを使用してください。
サーバアプリケーションプロセスがシングルスレッドで動作する形態です。本モードは、サーバアプリケーションより呼び出される他製品のライブラリが、マルチスレッドで動作するプロセス上で呼び出すことができない場合にのみ使用してください。