![]() | はじめに | CCI | ![]() |
この章ではクライアント/サーバ結合の原理を説明し、ユーザのプログラムを汎用クライアント/サーバモジュールに結合する方法を説明します。
64 ビット
64 ビットモードで実行しているアプリケーションはクライアント/サーバ結合を使用できません。
クライアント/サーバ結合とは、ユーザが通信プログラムに煩わされずにクライアント/サーバアーキテクチャを実現できる、30 クライアントまでの簡便なリモートプロシージャコール (RPC) メカニズムです。
クライアント/サーバ結合は、Server Express の一部として提供されており、フォールトトレラントな大規模ミドルウェアソリューションを必要としないアプリケーションで使用します。
クライアント/サーバ結合が提供する諸機能とパフォーマンスが、自社のビジネスに適当であるかどうかを確認してください。 多くの場合、クライアント/サーバ結合により、導入しやすくコストパフォーマンスのよいソリューションが提供されます。
このクライアント/サーバ結合が提供する mfclient と mfserver という 2 つのモジュールにより、ユーザがアプリケーションに通信プログラムを組み込む必要がなくなります。 この 2 つのモジュールはあらゆるアプリケーションで利用できる汎用モジュールです。
この 2 つのモジュールは、構成ファイルの設定に従って通信リンクを管理し、データ転送を行います。 各通信リンクの最後には、ユーザ定義プログラムとデータを交換することもできます。 mfclient モジュールはユーザが作成したクライアントプログラム (たとえば、ユーザインターフェイスを処理するプログラム) から呼び出されますが、mfserver はユーザが作成したサーバプログラム (たとえば、データアクセスやアプリケーションロジックを処理するプログラム) を呼び出します。
ユーザが作成するクライアントプログラムとサーバプログラムは mfclisrv.cpy というコピーファイルを使用して、汎用のクライアント/サーバモジュールと相互通信します。 COBCPY 環境変数を設定してコピーファイルの場所を指定することができます。 COBCPY の詳細については、『Server Express ユーザガイド』の付録、『Micro Focus 環境変数』の項を参照してください。
Server Express では、 クライアントとサーバの間でデータを転送する Csbind というアプリケーション例を使用できます。このアプリケーションでは、クライアント/サーバ結合の使用方法を示します。 このデモプログラムは Infomgr を使用して検索します。
クライアント/サーバ結合は、サーバ階層上で mfserver の非専用コピーを実行することによって可能になります。 mfserver は、取り決めたサーバ名を使用してすべてのクライアントと通信します。 mfserver モジュールの機能は、クライアントからの要求を受けて接続の確立や終了を行うのみであるため、最初のデフォルト値のまま使用できます。
情報の流れを次に示します。 (ここでは、デモ用のアプリケーション、Csbind のプログラムファイルをクライアントプログラム例およびサーバプログラム例として使用します。)
ユーザのクライアントプログラム (netxcli.cbl) がファイルの終わりを検出するまで、このようなレコード単位の読み込み/書き込みループが繰り返されます。 ファイルの終わりに来ると、クライアントプログラムはファイルをクローズし、プログラムの終了をサーバに知らせます。 これに対してサーバはファイルをコピーしたディレクトリ名を返します。
アプリケーションでクライアント/サーバ結合を使用するには、次の作業が必要です。
上記の各手順について、以下の各項で詳しく説明します。
mfclient と mfserver の 2 つのモジュールは mfclisrv.cpy というコピーファイルに定義されたパラメータブロック (LNK-PARAM-BLOCK) を通して情報の受け渡しを行います。 このパラメータブロックは、ユーザプログラムを呼び出すときの情報の引き渡しでも使用します。 mfclisrv.cpy コピーファイルは、mfclient と mfserver の 2 つのモジュールを使用するすべての COBOL プログラムにインクルードされなければなりません。
この mfclisrv.cpy コピーファイルは Infomgr を使用して検索します。
クライアント/サーバ結合では、構成ファイルを使用して mfclient と mfserver の 2 つのモジュールの動作と通信リンクを制御します。
クライアント/サーバ結合の構成ファイルは、拡張子が .cfg の ASCII テキストファイルです。 構成ファイル名を特に指定しなければ、デフォルトの構成ファイル名、mfclisrv.cfg が使用されます。
アプリケーションごとに別の構成ファイルを作成することができ、また 1 つの構成ファイルに複数のエントリを入れることもできます。 複数のエントリを入れる場合は、ファイル内で各アプリケーション固有のタグを指定し、その後にそのアプリケーションのパラメータリストを続けます。 クライアントプログラムでは、LNK-PARAM-BLOCK ブロックの LNK-TAGNAME フィールドを使用してこのタグ名を指定しなければなりません。 この方法を使うと、デフォルトの構成ファイル mfclisrv.cfg 内に複数エントリを指定することにより、コマンドラインを短くすることができます。
クライアント/サーバアプリケーションの設定や構成ファイルのエントリに誤りがあれば、プログラムはエラー内容を詳しく示すメッセージを画面に表示して終了します。
このようなエラーは、画面に表示されるだけでなく、mfclisrv.log ファイルにも記録されます。 このファイルはカレントディレクトリに作成されるか、MFLOGDIR 環境変数で指定されたディレクトリに作成されます。 このため、端末が直接接続されていないサーバでもメッセージを記録できます。
次に mfclisrv.cfg 構成ファイルのエントリ一覧をアルファベット順に示します。 構成ファイルに指定されていないパラメータについてはデフォルト値が使用されます。
| cblksize=nnnn | PIC X(4) COMP-X [デフォルト: 0]
ダイアログシステム の制御ブロック。 ダイアログシステム を使用する場合にのみ必要です。 |
| clierrprog=name | PIC X(128) [デフォルト: なし]
mfclientm に代わって通信エラーを処理するプログラム名。 mfclient エラーを呼び出し側プログラムで処理する場合は、SAME を指定します。 |
| commsapi=api | PIC X(4) [デフォルト: CCI]
通信 API。 有効な値は、CCI または NONE。 2 階層アプリケーションを作成して、通信プログラムをまったく使わずに 1 台の PC でテストを行えるようにするには、特殊エントリの NONE を指定します。 mfserver と通信要求がバイパスされ、データは mfclient とユーザ定義のサーバプログラムの間で直接送受信されます。 注: ユーザ定義のサーバプログラムとして既存アプリケーションを使用している場合は、このオプションを指定できません。 |
| compress=nnn | PIC 9(3) [デフォルト: 000]
たとえば、001 の場合は、CBLDC001 というルーチンが使用されます。 0 を指定すると、データ圧縮は行われません。 |
| dblksize=nnnn | PIC X(4) COMP-X [デフォルト: 0]
ユーザ定義のクライアントプログラムとサーバプログラム間の、データの送受信で使用するユーザデータ領域のサイズ。 ダイアログシステムアプリケーションの場合は、この値が ダイアログシステムデータブロックのサイズになります。 警告: この値が、実際に使用しているデータ領域のサイズより小さければ、予期できないエラーが発生する可能性があります。 |
| eblksize=nnnn | PIC X(4) COMP-X [デフォルト: 0]
オプションの ダイアログシステムイベントブロックのサイズ。 |
| machinename=name | PIC X(34)
servername エントリで指定したサーバが存在するマシン名。 これを指定することで、システムがサーバを探す手間や同名のサーバとの混乱が避けられます。 |
| maxtrans=nn | PIC 99 [デフォルト: 0]
転送パッケージの最大サイズをキロバイトで指定します。 有効な値は 1 〜 62. です。 バッファ全体の大きさがこの値を超えると、システムはバッファを maxtrans サイズずつ分割して転送します。 |
| midconfig=filename | PIC X(128) [デフォルト: なし]
複数の階層にわたる問題のソリューションの一つとして mfclient が mfserver に呼び出されたときに使用する構成ファイル名。 このエントリを指定すると、mfserver がルータのように機能し、ローカルの mfclient モジュールにデータを渡します。 その場合の mfclient モジュールはこの構成ファイルを使用して、別のサーバを探して通信します。 この方法を使用すると、マシンごとに異なるプロトコルと通信 API を使用することができます。 |
| protocol=protocol | PIC X(8) [デフォルト: CCITC32]
使用する CCI プロトコル。 このエントリは、commsapi が CCI に設定されている場合にのみ有効です。 サポートしている CCI プロトコルは、Novell IPX (CCIIX32 と指定)、NetBEUI (CCINB32 と指定)、動的データ交換 (CCIDE32 と指定)、TCP/IP (CCITC32 と指定)です。 commsapi が CCI (デフォルト) に設定されている場合に protocol を指定しなければ、クライアント/サーバ結合で、デフォルトの TCP/IP (CCITC32) が使用されます。 |
| scrntype=type | PIC X(4) [デフォルト: なし]
たとえば、ユーザプログラムが GUI とキャラクタインターフェイスの両方をサポートしている場合は、このエントリを使用してクライアントプログラムがどちらのインターフェイスを使用するかを指定できます。 クライアント/サーバ結合モジュール自体は scrntype エントリを使用しません。 |
| servername=server | PIC X(14) [デフォルト: MFCLISRV]
通信で使用するサーバ名。 |
| setenv=name value | PIC X(148) [デフォルト: なし]
すべてのサーバプログラムの実行の前に環境変数を設定します。 形式は以下の通りです。 variable name PIC X(20) variable value PIC X(128) 名前と値のフィールドは 1 つ以上の空白で区切ります。 setenv エントリは 9 個まで指定できます。 |
| srvanim=x | PIC X(16) [デフォルト: N]
Y または N。 このパラメータを Y にすると、サーバ上でユーザプログラムのアニメーション表示が可能になります。 すなわち、mfserver をいったん停止して、COBSW=+A として再起動しなくても動的に設定されます。 UNIX システムの場合は、x,filename を指定すると、ユーザプログラムのクロスセッションアニメーションが可能になります。 詳細については、『アプリケーションのデバッグ』の項を参照してください。 |
| srverrprog=name | PIC X(128) [デフォルト: なし]
mfserver に代わって通信エラーを処理するプログラム名。 mfserver エラーのために srvprog エントリで指定したものと同じにする場合は、SAME を指定します。 |
| srvprog=name | PIC X(128)
mfserver が呼び出すユーザ定義プログラムの名前。 |
| srvtier=name | PIC X(128) [デフォルト: mfserver]
サーバ階層プログラムの名前。 これが指定されると、mfserver はこのプログラムから呼び出されます。 |
| subserver=base-name | PIC X(14) [デフォルト: なし]
サブサーバプロセスとの通信で使用するベース名を指定します。 デフォルトのサーバ名は mfclisrv であるため、そのままでは、サブサーバ名が mfclisrv00001、mfclisrv00002、... となります。 このパラメータに newserv を指定すると、サブサーバ名は newserv00001、newserv00002、... となります。 このパラメータを使用すると、ベースサーバ名を変えずにアプリケーション固有のサブサーバ名を使用できます。 |
| timeout=nnnn | PIC X(4) COMP-5 [デフォルト: 120 秒)
このパラメータは、システムのデフォルトのタイムアウト値より優先されます。 タイムアウト値は 1/10 秒単位で指定します。 このとき、すでに呼び出されているものについては、呼び出された時点で有効だったタイムアウト値がそのまま使用されます。 |
| ublksize=nnnn | PIC X(4) COMP-X [デフォルト: 0]
オプションのユーザデータブロックのサイズ。 |
| useraudit=x | PIC X [デフォルト: N]
Y または N。 このパラメータを Y に設定すると、クライアントの接続と切断の詳細がログに記録されます。 設定すると、次のような詳細情報がクライアントとサーバの両方によって記録されます。 日付、時刻、接続 / 切断インジケータ、サーバ名、マシン名、およびプロトコル。 記録先はシステムログファイルですが、 詳細については、『システムログファイル』と『監査ログの作成』の項を参照してください。 |
構成ファイルで最低限必要なエントリは、次の要因によって異なります。
どんな場合にも必要なエントリを次に示します。
| dblksize | データ転送で使用するユーザデータ領域のサイズ。 |
| srvprog | サーバ側の処理を行うために mfserver が呼び出すプログラム名。 これは、サーバマシンで実行されるユーザプログラム (すなわち、データアクセスとアプリケーションロジックを処理するプログラム) です。 |
複数サーバを実行する場合は、servername エントリを使用してサーバ名を指定しなければなりません。
CCI を使用しない場合は commsapi エントリを設定しなければなりません。 また、CCI を使用しても TCP/IP 以外を使用する場合は protocol エントリを設定しなければなりません。
構成ファイルに設定されていないパラメータについては、それぞれ固有のデフォルト値が使用されます。
構成ファイルはユーザにもっとも便利な場所に置くことができます。 mfclient と mfserver の 2 つのプログラムは構成ファイルを次の方法で見つけ出します。
構成ファイル名をどの方法で指定する場合でも、場所と名前を合わせて 128 字までの完全パス名で指定できます。
mfclient と mfserver の 2 つのモジュールは mfclisrv.cpy というコピーファイルに定義されたパラメータブロック (LNK-PARAM-BLOCK) を通して情報の受け渡しを行います。 このパラメータブロックは、ユーザプログラムを呼び出すときの情報の引き渡しでも使用します。
ユーザのプログラムに次の例のようなコードを追加して、mfclient にパラメータを渡せるようにします。
$SET ANS85
WORKING-STORAGE SECTION. ...... ......
*--- mfclisrv.cpy をクライアントプログラムの作業場所節と
*--- サーバプログラムの連絡節にインクルード
*--- する必要があります。
COPY "mfclisrv.cpy".
LINKAGE SECTION. ...... ......
*--- Input-Rec はユーザクライアントと
*--- サーバプログラムの間でデータを転送する
*--- ために使用する領域です。このデータ領域の
*--- サイズは、mfclient モジュールによって読み込まれる
*--- クライアント/サーバ結合構成ファイル内の
*--- ユーザによって定義されます。mfclient は
*--- この領域に必要なメモリをセットアップし、
*--- この領域のポインタをユーザクライアントプログラムに返します (下記参照)。
01 INPUT-REC PIC X(32767)
PROCEDURE DIVISION.
CLIENT-CONTROL SECTION.
PERFORM UNTIL END-CONNECTION
*--- lnk-client は同じ "mfclient" を保持します。
*--- 初回は、mfclient を初期化してサーバとの
*--- コンタクトを確立します。
CALL LNK-CLIENT USING LNK-PARAM-BLOCK
EVALUATE TRUE
*--- mfclient が返したアドレスを割り当てることによって
*--- ユーザデータ領域 (Input-Rec) にユーザがアクセス可能になります。
WHEN START-CONNECTION
SET ADDRESS OF INPUT-REC TO LNK-DBLOCK-PTR
WHEN END-CONNECTION
EXIT PERFORM
WHEN OTHER
*--- アプリケーションクライアントロジックを実行します。 たとえば、
*--- ユーザインターフェイスデータを表示して承認します。
......
END-EVALUATE
*--- ユーザ定義フラグ (たとえば、EXIT-FLG-TRUE) を設定して、
*--- クライアント処理が終了したことを示します。 たとえば、
*--- アプリケーションインターフェイスの [終了] ボタンをクリックした
*--- 可能性があります。
IF EXIT-FLG-TRUE
SET CLIENT-ENDING TO TRUE
END-IF
END-PERFORM.
CLIENT-CONTROL-END.
STOP RUN.
1 つのプリケーションのクライアント数 を制御したり、 エラーメッセージの表示を自分のプログラムで行う場合は、ユーザプログラムの最初の EVALUATE 文に次のようなコードを追加する必要があります。
WHEN TOO-MANY-CLIENTS
PERFORM OVER-CLIENT-LIMIT
WHEN COMMS-ERROR
PERFORM SHOW-ERROR
......
OVER-CLIENT-LIMIT SECTION.
DISPLAY SPACES AT 0101 WITH BACKGROUND-COLOR 7
"MAXIMUM NUMBER OF CLIENTS EXCEEDED - SESSION ENDED"
AT 1012 WITH FOREGROUND-COLOR 4
SET EXIT-FLG-TRUE
SET CLIENT-ENDING TO TRUE
EXIT.
SHOW-ERROR SECTION.
DISPLAY LNK-ERROR-LOC AT 2201
DISPLAY LNK-ERROR-MSG AT 2301 WITH SIZE LNK-ERROR-MSG-LEN.
EXIT.
非同期要求を 処理する場合は、EVALUATE 文に次のようなコードを追加しなければなりません。
WHEN START-CONNECTION
PERFORM GET-USER-INPUT
IF MAKE-ASYNC-REQUEST <* ユーザ非同期オプション
SET ASYNC-REQUEST TO TRUE
END-IF
WHEN ASYNC-OK
SET TEST-ASYNC-RESULT TO TRUE
PERFORM DELAY-LOOP
WHEN ASYNC-INCOMPLETE
DISPLAY "REQUEST STILL BEING PROCESSED" AT 1010
PERFORM DELAY-LOOP
SET TEST-ASYNC-RESULT TO TRUE
WHEN RESULT-OK
DISPLAY "REQUEST-COMPLETED " AT 1010
PERFORM GET-USER-INPUT
WHEN ASYNC-NOT-STARTED
WHEN ASYNC-FAILED
DISPLAY "ASYNCHRONOUS REQUEST FAILURE " AT 1010
PERFORM SHOW-ERROR
PERFORM GET-USER-INPUT
WHEN COMMS-ERROR
PERFORM SHOW-ERROR
mfclient と mfserver の 2 つのモジュールは mfclisrv.cpy というコピーファイルに記述されているパラメータブロックを通して情報の受け渡しを行います。 このパラメータブロックは、ユーザプログラムを呼び出すときの情報の引き渡しでも使用します。
ユーザのサーバプログラムでは mfclisrv.cpy コピーファイルを LINKAGE SECTION にインクルードします。 また、PROCEDURE DIVISION のヘッダに LNK-PARAM-BLOCK パラメータブロックを指定して mfserver からパラメータを受け取れるようにします。
次のサンプルサーバコードで説明します。
LINKAGE SECTION.
01 INPUT-REC PIC X(32767)
COPY "MFCLISRV.CPY".*--- lnk-param-block は mfclisrv.cpy 内のレコード定義です。
PROCEDURE DIVISION USING LNK-PARAM-BLOCK.
CONTROLLING SECTION.
*---------------------------------------------------------------*
* ユーザデータと lnk-parm-block 内のポインタを
* 関連付けます。
*---------------------------------------------------------------*
SET ADDRESS OF INPUT-AREA TO LNK-DBLOCK-PTR.
EVALUATE TRUE
WHEN START-CONNECTION
PERFORM PROGRAM-INITIALIZE
WHEN OTHER
PERFORM PROGRAM-BODY
END-EVALUATE.
EXIT PROGRAM.
PROGRAM-INITIALIZE SECTION.
*--- このコードは、ユーザサーバプログラムの初期化コード、
*--- たとえばアプリケーションデータファイルを開く操作を
*--- インクルードします。
......
PROGRAM-BODY SECTION.
*--- この節は、アプリケーション処理コード、
*--- たとえば、データファイルの読み書きを
*--- インクルードします。
......
エラーメッセージの表示を自分のプログラムで行う場合は、プログラムの最初の EVALUATE 文に次のようなコードを追加します。
WHEN COMMS-ERROR
PERFORM SHOW-ERROR
......
SHOW-ERROR SECTION.
DISPLAY LNK-ERROR-LOC AT 2201
DISPLAY LNK-ERROR-MSG AT 2301 WITH SIZE LNK-ERROR-MSG-LEN.
EXIT.
mfserver モジュールは .int ファイルとして提供されており、そのまま実行するか、.gnt ファイルを生成します。
mfclient と mfserver の各モジュールは、クライアントとサーバの各コンポーネントを手動で実行して、標準の COBOL プログラムとして実行されます。
既存のスタンドアロンプログラムをサーバとして実行する場合は、ベースサーバが実行するプログラムとして、その名前を指定します (srvtier)。 通信は、名前を DSRUN に変更された mfserver モジュールのコピーによって処理されます。このコピーは、次のようにして作成されます。
既存のプログラムをサーバとして使用することの主な利点は、単一の PC または PC ネットワークでアプリケーションを実行することができ、クライアント/サーバ結合を使用し単一のユーザインターフェイスプログラムを提供するだけで、クライアント/サーバアプリケーションとして実装できることです。
クライアント/サーバ結合を実行する手順は、以下のとおりです。
クライアントプログラムを起動するコマンドラインは次のとおりです。
cobrun mfserver [-b] [-p protocol] [-s server-name] [-v]
各パラメータの説明は以下のとおりです。
クライアントプログラムを起動するコマンドラインは次のようになります。
run program-name [config-filename]
各パラメータの説明は以下のとおりです。
| program-name | ユーザインターフェイスプログラム名を指定します。 |
| config-filename | 使用する構成ファイル名を指定します。 |
Server Express の標準デバッグ機能を使用して、クライアントプログラムをデバッグできます。
サーバプログラムをアニメートする場合は、構成ファイルで srvanim=y というパラメータ設定を行います (詳細については、 『構成ファイルのパラメータ』の項を参照してください)。
mfserver を起動した端末で Animator が実行されるため、mfserver がフォアグラウンドモードで実行されていなければなりません。 mfserver はバックグラウンドプロセスとして実行されることが望ましいため、これは問題です。 さらに、同時に mfserver からアニメーションを表示できるのは、一人のユーザのみであるという制約があります。 このような問題はクロスセッションデバッグを使用することによって避けられます。 詳細については、『デバッギングハンドブック』の『Animator の起動』の章の『クロスセッションデバッグ』の項を参照してください。
CCI 通信 API を使用している場合は、mfcsmgr プログラムを実行して必要なパラメータと値を渡すことで、サーバの動作を一時的に変更できます。 指定できるパラメータはロケーションとアクションの 2 つのグループに分けられます。 ロケーショングループのパラメータで、ターゲットサーバを指定することができ、m、p、または s を設定できます。 アクティブグループのパラメータは、ターゲットサーバの動作に関するもので、a、c、o、r、または t を設定できます。 パラメータの中には o、r、t のように単独でのみ指定できるものがあります。
生成されたサーバは、クライアントが正常終了するときにクライアントプログラムによって終了されます。 CCI 通信 API を使用している場合は、最初のサーバプログラムがクライアントの終了時に終了されないため、手動でシャットダウンして、最初のサーバを終了させなければなりません。
CCI 通信 API を使用する場合は、アクティブなサーバを誤ってシャットダウンしてしまうことがないように各サーバにパスワードを割り当てることができます。 こうすると、サーバを終了したりサーバのパラメータを変更するときにパスワードが要求されます。
CCI 通信 API を使用する場合にサーバがサポートできる最高クライアント数は、デフォルトでは 30 ですが、mfcsmgr を使用してより小さい値を設定できます。 そこで指定した値はパスワードファイルに保存され、サーバが起動するたびに読み込まれます。
サーバがサポートしているオーバーライドオプションは、server-name、protocol、machine-name です。 サーバは構成ファイルを使用しないため、オーバーライドパラメータは mfcsmgr プログラムで指定します。 このプログラムを実行すると、指定されたオーバーライドを処理するためにクライアントとサーバ間で短いやり取りが起こります。
mfcsmgr のコマンドライン構文を次に示します。
UNIX
cobrun mfcsmgr [-a] [-c nnnnn] [-d] [-i filename] [- m machine-name]
[-p protocol] [-s server-name] [-o m, machine-name]
[-o p, protocol] [-o r] [-o s, server-name] [-t] [-v]
ここで、パラメータの内容は以下のとおりです。
| -a | ターゲットサーバの権限パスワードを変更します。 |
| -c,nnnnn | サーバがサポート可能なクライアント数を設定します。 |
| -d | クライアントの終了時に、ローカルのオーバーライドファイル (mfcsovrd.cfg) を削除します。 |
| -i filename | クライアントの終了時に、指定のファイルをクライアントのローカルディレクトリにインストールします。 |
| -m machine-name | ターゲットサーバを実行しているマシン名を指定します。 これは、複数のプラットフォームに同名のサーバが存在する場合に必要です。 |
| -p protocol | 使用する通信プロトコルとして、TCP/IP (CCITC32)、NetBEUI (CCINB32)、Novell IPX (CCIIX32)、動的データ交換 (CCIDE32) のいずれかを指定します。 |
| -s server-name | デフォルト (mfclisrv) 以外のサーバ名を指定します。 |
| -o m,machine-name | オーバーライドを実行するマシン名を指定します。 |
| -o p,protocol | オーバーライドサーバへのアクセスにはこのプロトコルを使用します。 |
| -o r | 現在アクティブなオーバーライドをリセットします。 元の設定に戻します。 |
| -o s,server-name | ターゲットサーバへの接続を、このサーバへの接続でオーバーライドします。 |
| -t | サーバを終了します。 |
| -v | mfserver のバージョン番号を表示します。 |
上記のフラグは - または / を付けて指定します。 大文字と小文字は区別されません。
mfclient と mfserver はエラーとメッセージのログを維持管理します。 ログエントリはすべて日付と時刻を付けて mfclisrv.log ファイルに保存されます。 このログファイルはプログラムを起動したディレクトリ、または MFLOGDIR 環境変数で指定したディレクトリにあります。 ログファイルをときどきチェックして、システムが正常に機能していることを確認してください。
クライアントがサーバに接続したときの日付と時刻を記録した監査ログを作成できます。 この機能を有効にするには、構成ファイルで useraudit=y を設定します。
監査ログの情報は前項で説明したシステムログファイルに記録されます。
構成ファイルを読み込んだ後は、クライアント/サーバ結合が、各クライアントの起動処理中に、mfcsovrd.cfg というオーバーライドファイルを探します。 このファイルが見つかると、その内容を調べ、構成ファイルに従って設定されているパラメータをオーバーライドします。 オーバーライドファイルの形式は通常の構成ファイルとほぼ同じですが、override-cntrl というエントリが 1 つだけ追加されています。 このエントリにより、オーバーライドの対象を、サーバ名とタグ名のどちらで指定するかが指示されます。 ここにサーバ名を指定すると、そのサーバを使用するクライアントすべてのパラメータが、オーバーライドファイルの内容に従って変更されます。 タグ名を指定すると、そのタグ名を使用するクライアントのパラメータのみがオーバーライドされます。
このようなクライアントオーバーライド機能を使用するのは、たとえばサーバが使用不可能になったため、アプリケーションを別のマシン上で実行しなければならない場合です。 個々の構成ファイルを変更する方法もありますが、オーバーライドファイルを使用すれば、1 つのファイルを使用するだけですべてのアプリケーションの接続先を変更できます。
このオーバーライド機能はサーバでも使用できますが、そのためには、サーバマシンが起動され、稼動している必要があります。 この場合もサーバ名またはタグ名にオーバーライドできます。
オーバーライドファイルが見つかると、そのことがログファイルに記録されます。 同時にオーバーライドの対象となるパラメータもすべて記録されます。
オーバーライド機能を使用して、クライアントの接続先サーバを変更する例を次に示します。
[override-cntrl] override=servername [oldserver] servername=newserver
上の例では、[override-cntrl] セクションでオーバーライドの対象とするサーバ名を指定 (override=servername) し、そのサーバ名 ([oldserver]) の下に新たな接続先サーバ名を指定 (servername=newserver) しています。 この場合は、ログファイルには次のように記録されます。
20/04/1998 11:01:02 Using Local File: mfcsovrd.cfg Overriding Entries for Servername:OLDSERVER servername=newserver 20/04/1998 11:01:02 Override Completed:
特定のタグを使用するすべてのクライアントのサーバをオーバーライドする例を次に示します。
[override-cntrl] override=tagname [mf-clisrv] servername=newserv
上記の例では、[override-cntrl] セクションでオーバーライドの対象とするタグ名を指定 (override=tagname) し、そのタグ名 ([mf-clisrv]) の下にオーバーライドするパラメータ (この場合はサーバ名) を指定 (servername=newserv) しています。 この場合は、ログファイルに次のように記録されます。
20/04/1998 11:04:02 Using Local File: mfcsovrd.cfg Overriding Entries for Tagname:MF-CLISRV servername=newserv 20/04/1998 11:04:02 Override Completed:
クライアント/サーバ結合でダイアログシステムのコールアウト機能を使用するときには、クライアントプログラムを多少変更し、接続の両端でコールアウト要求に応えるプログラムを作成する必要があります。 次のように、ユーザクライアントプログラムに 2 つの行と 1 つの指令を追加する必要があります。
プログラムの先頭に次の指令を追加します。
$set ans85 linkcount(128)
WORKING-STORAGE 節に次の行を追加します。:
01 lnk-param-block-addr POINTER EXTERNAL.
PROCEDURE DIVISION に次の行を追加します。
SET lnk-param-block-addr TO ADDRESS OF lnk-param-block
これは、ダイアログシステムがコールアウト要求を処理するために呼び出すプログラムが、ユーザクライアントプログラムと同じパラメータエントリにアクセスできるようにするためです。 これは、外部データポインタの使用によって実現されます。 コールアウトプログラムは次の例のコードのようなコードでなければなりません。
$set ans85
WORKING-STORAGE SECTION. ......
01 lnk-param-block-addr POINTER EXTERNAL.
LINKAGE SECTION. ......
COPY "mfclisrv.cpy".
01 user-data-block PIC X(30).
PROCEDURE DIVISION.
Controlling SECTION.
SET ADDRESS OF lnk-param-block TO lnk-param-block-addr
SET ADDRESS OF user-data-block TO lnk-ublock-ptr
SET ds-callout TO TRUE
MOVE "callosrv" TO user-data-block
CALL lnk-client USING lnk-param-block
EXIT PROGRAM.
サーバでコールアウト要求を受け取るプログラムの名前はユーザデータブロックに設定されます。 このプログラムの名前が、ダイアログシステムに使用されているコントロールブロックのいずれかのデータからのみ決定可能な場合は、次のプログラムのようなコーディングを使用して、このブロックをアクセス可能にする必要があります。
$set ans85 linkcount(128)
WORKING-STORAGE SECTION. ......
01 lnk-param-block-addr POINTER EXTERNAL.
LINKAGE SECTION. ......
COPY "mfclisrv.cpy".
01 user-data-block PIC X(30).
COPY "DS-CNTRL.MF".
COPY "CUSTOMER.CPB".
PROCEDURE DIVISION USING ds-control-block customer-data-block.
Controlling SECTION.
SET ADDRESS OF lnk-param-block TO lnk-param-block-addr
SET ADDRESS OF user-data-block TO lnk-ublock-ptr
SET ds-callout TO TRUE
EVALUATE cust-callout-flg
WHEN 1
MOVE "callprog1" TO user-data-block
WHEN 2
MOVE "callprog2" TO user-data-block
END-EVALUATE
CALL lnk-client USING lnk-param-block
EXIT PROGRAM.
サーバ側のコールアウトプログラムは次のようになります。
$set ans85
LINKAGE SECTION. ......
COPY "DS-CNTRL.MF".
COPY "CUSTOMER.CPB".
PROCEDURE DIVISION USING ds-control-block customer-data-block.
Controlling SECTION.
............ Code to
........... process callout
............ request....
EXIT PROGRAM.
クライアント/サーバ結合は、既存のダイアログシステムプログラムをユーザサーバモジュールとして使用することができ、srvtier=<your
program> の場合に使用されます (詳細については、『構成ファイルのパラメータ』の項を参照してください)。
この場合は、mfserver が、ダイアログシステム API に準拠するパラメータのセットで呼び出されることが予想されます。 このように使用されると、ユーザプログラムは mfserver を呼び出してクライアントにデータを転送して、サーバ上の制御要素になります。 ダイアログシステムが使用する API に準拠している限り、その他のプログラムでも同じ機能を行うことができます。
クライアント/サーバ結合は通常、API の最初のパラメータ内で特定の項目を調べ、見つかった値に基いて特定の機能を実行します。 この動作が行われないようにするには、これらの項目を HIGH-VALUES に設定します。 次のパラメータで mfserver を呼び出してください。
これらの項目のサイズは両方とも、アプリケーションの実行に使用する構成ファイルで定義してください。 デモプログラムと必要な構成ファイルの例を次に示します。
$set ans85
WORKING-STORAGE SECTION. ......
01 w-prog-id pic x(30) value
'"@(#) nodscli.cbl 1.1.1"'.
copy "mfclisrv.cpy".
01 ws-scrn-pos.
03 ws-line pic 99 value 07.
03 ws-col pic 99 value 1.
LINKAGE SECTION. ......
01 ds-control-block pic x(6).
01 NODS-DATA-BLOCK.
03 NODS-PARAM PIC 99.
03 NODS-DATA PIC X(120).
procedure division.
000-control section.
* サーバとの最初のコンタクトを行います。
call lnk-client using lnk-param-block
if start-connection
set address of ds-control-block to lnk-cblock-ptr
set address of nods-data-block to lnk-dblock-ptr
end-if
display spaces at 0101
"Starting Test Session" at 0510
perform 010-run-test until nods-param = 10
* 切断要求を送信します。
set client-ending to true
call lnk-client using lnk-param-block
display "Test Session Completed" at 2010
stop run.
010-run-test section.
* サーバからデータを取得します。
call lnk-client using lnk-param-block
add 1 to ws-line
display nods-data(1:80) at ws-scrn-pos
exit.
$set ans85
working-storage section.
01 w-prog-id pic x(30) value
'"@(#) nodssrv.cbl 1.1.1"'.
01 dummy-cntrl-block pic x(6) value high-values.
01 NODS-DATA-BLOCK.
03 NODS-PARAM PIC 99.
03 NODS-DATA PIC X(120).
copy "mfclisrv.cpy".
01 ws-sub pic 99.
01 ws-table.
03 ws-letts pic x occurs 10.
procedure division.
controlling section.
move "ABCDEFGHIJ" to ws-table
move 0 to nods-param
*
* クライアントとのコンタクトを確立します。
* クライアントのタイムアウトとサーバ探索のための
* ネットワークの「ポーリング」を中止するために、これは
* できるだけ早く行う必要があります。
*
call "mfserver" using dummy-cntrl-block nods-data-block
*
* クライアントがシャットダウン要求を出した後で mfserver を
* 呼び出さないことを保証する必要があります。 このシステムでは、
* nods-param = 10 と指定すると、クライアントがシャットダウン
* 要求を出して、このプログラムのくり返し実行を終了します。
*
perform varying nods-param from 1 by 1
until nods-param > 10
perform varying ws-sub from 1 by 1
until ws-sub > 80
move ws-letts(nods-param)
to nods-data(ws-sub:1)
end-perform
call "mfserver" using dummy-cntrl-block
nods-data-block
end-perform
stop run.
********************************************************* * Micro Focus - クライアント/サーバモジュール構成ファイル * ********************************************************* [mf-clisrv] srvtier=nodssrv cblksize=6 dblksize=122 servername=nods
コンパイルされ、実行されると、サーバプログラムは、サーバでない場合もクライアントにデータを渡しつづけます。これは、プログラムが呼び出される側のプログラムであり、クライアントにデータを渡す必要が生じるたびに EXIT PROGRAM を実行しなければならない場合です。既存のプログラムが、必要なダイアログシステム API に従っていない場合は、以下のような小さな橋渡しのプログラムを作成すれば、前述の方法を用いることができます。
WORKING-STORAGE SECTION.
01 dummy-control-block PIC X(6) VALUE HIGH-VALUES.
01 grouped-data-block.
03 ws-param-1 PIC X(50).
03 ws-param-2 PIC X(120).
03 ws-param-3 PIC X(18).
03 ws-param-4 PIC X(48).
LINKAGE SECTION. ......
01 lnk-param-1 PIC X(50).
01 lnk-param-2 PIC X(120).
01 lnk-param-3 PIC X(18).
01 lnk-param-4 PIC X(48).
PROCEDURE DIVISION USING
lnk-param-1 lnk-param-2
lnk-param-3 lnk-param-4.
MOVE lnk-param-1 TO ws-param-1
MOVE lnk-param-2 TO ws-param-2
MOVE lnk-param-3 TO ws-param-3
MOVE lnk-param-4 TO ws-param-4
CALL "mfserver" USING dummy-control-block
grouped-data-block
MOVE ws-param-1 TO lnk-param-1
MOVE ws-param-2 TO lnk-param-2
MOVE ws-param-3 TO lnk-param-3
MOVE ws-param-4 TO lnk-param-4
EXIT PROGRAM.
クライアント/サーバ結合の強力な機能の 1 つとして、構成ファイルによる通信条件の制御があります。 ただし、エンドユーザが構成ファイルのエントリを変更してアプリケーションの動作を変更できるということが望ましくない場合もあります。
このような場合は、構成パラメータをすべてクライアントプログラム内で指定することができます。こうすると、構成ファイルがまったく使用されないため、エンドユーザはアプリケーションの動作を変更できません。 その場合も、ユーザが複雑な通信コードを書く必要はなく、目的のパラメータをクライアントプログラム内で簡単に指定できます。 パラメータの指定は、load-inline-cfg と end-inline-cfg の 2 つの設定の間で行います。 パラメータエントリは 1 つずつ lnk-error-msg にロードし、mfclient を呼び出して処理します。 パラメータの設定は実際の処理ループが開始される前に行わなければなりません。 インライン設定の例を次に示します。
WORKING-STORAGE SECTION.
COPY "mfclisrv.cpy".
LINKAGE SECTION. ......
01 INPUT-REC PIC X(32767)
PROCEDURE DIVISION.
Client-Control SECTION.
SET load-inline-cfg TO TRUE
MOVE "clierrprog=same" TO lnk-error-msg
CALL lnk-client USING lnk-param-block
MOVE "srverrprog=same" TO lnk-error-msg
CALL lnk-client USING lnk-param-block
MOVE "servername=mainserv" TO lnk-error-msg
CALL lnk-client USING lnk-param-block
SET end-inline-cfg TO TRUE
* メインループはサーバとの接続が終わるまで
* 繰り返します。
PERFORM UNTIL End-Connection
* 'lnk-client' holds the name 'mfclient'
* 初回は、システムを初期化してサーバとのコンタクトを
* 確立します。
CALL lnk-client USING lnk-param-block
EVALUATE TRUE
WHEN start-connection
........ プログラムの残りは、この
........... ポイントから先は標準です ............
外部の構成ファイルとインライン設定の両方を使用することもできます。 そうすると、エンドユーザも必要に応じてシステムをある程度制御でき、クライアントプログラムは最終的な制御権を保持しているという両方の利点が得られます。 構成ファイルが先に処理され、次にインライン設定が処理されます。 したがって、構成ファイルで不適切なパラメータ設定が行われても、インライン設定で上書きできます。 この方法を使用する処理は、use-combined-cfg の設定により開始され、以前と同様に、end-inline-cfg により完了されます。
WORKING-STORAGE SECTION.
COPY "mfclisrv.cpy".
LINKAGE SECTION. ......
01 INPUT-REC PIC X(32767)
PROCEDURE DIVISION.
Client-Control SECTION.
SET use-combined-cfg TO TRUE
CALL lnk-client USING lnk-param-block
SET load-inline-cfg TO TRUE
MOVE "servername=mainserv" TO lnk-error-msg
CALL lnk-client USING lnk-param-block
SET end-inline-cfg TO TRUE
* メインループはサーバとの接続が終わるまで
* 繰り返します。
PERFORM UNTIL End-Connection
* 'lnk-client' は 'mfclient' という名前を保持します。
* 初回は、システムを初期化してサーバとのコンタクトを
* 確立します。
CALL lnk-client USING lnk-param-block
EVALUATE TRUE
WHEN start-connection
........ プログラムの残りは、この
........... ........... ポイントから先は標準です ............
クライアント/サーバ結合では、構成ファイルで指定された大きさのデータブロックを格納できるバッファが割り当てられます。 クライアントプログラムとサーバプログラムの間で制御が移動するたびに、このサイズのバッファが送受信されます。 そのため、ネットワークに不必要に大きな負荷がかかる場合があります。 たとえば、22K のレコード領域を持つ 24K のバッファが割り当てられた場合を考えてみましょう。 ファイルが 10 バイトのレコードキーを持つ場合は、クライアントとサーバの間でキーをやり取りするには 10 バイトのみが必要ですが、24K のバッファが使用されます。 実際にはデータサイズより 1 〜 2 バイト余分に必要ですが、バッファ全体よりははるかに小さいサイズです。 そこで、ネットワーク上を転送されるデータサイズを必要な大きさに限定するための縮小データ転送 (RDT) 機能が提供されています。
RDT 機能を使用するには、制御フラグ (use-rdt) と次の 3 つのパラメータが必要です。
インデックスファイルに対してレコード (顧客詳細情報) の追加、削除、読み込みを行うアプリケーションを例にとると、このインデックスファイルのレコードキーは顧客コードです。 このアプリケーションには、顧客レコードの操作のみでなく、顧客情報をインターフェイス画面から消してしまうオプションもあります。 このサンプルアプリケーションのコードの一部を次に示します。user-data-block 領域には、6 バイトのレコードキーが入ります。 クライアントとサーバの間で顧客詳細情報レコードをやり取りするために使用するデータブロック領域 (dblksize) は、 customer-data-block です。customer-c-code は、 customer-data-block 内の 6 バイトのデータ項目で、ここにレコードキーが保管されます。
クライアント側のコードは次のようになります。
EVALUATE TRUE
WHEN customer-load-flg-true
*--- ユーザがインターフェイスで顧客コードを入力し LOAD オプションを選択して、
*--- そのコードに関係する顧客の詳細情報を
*--- 読み込んで表示します。
MOVE customer-c-code TO user-data-block
SET use-rdt TO TRUE
MOVE 1 TO lnk-usr-fcode
MOVE 4 TO lnk-usr-retcode
MOVE 6 TO lnk-data-length
WHEN customer-del-flg-true
*--- ユーザが顧客コードを入力して DELETE オプションを選択して、
*--- ファイルから顧客レコードを削除しました。
MOVE customer-c-code TO user-data-block
SET use-rdt TO TRUE
MOVE 2 TO lnk-usr-fcode
MOVE 4 TO lnk-usr-retcode
MOVE 6 TO lnk-data-length
initialize customer-data-block
WHEN customer-clr-flg-true
*--- ユーザが CLEAR オプションを選択して、現在の
*--- 顧客詳細情報を画面からクリアしました。
SET use-rdt TO TRUE
MOVE 0 TO lnk-usr-retcode
initialize customer-data-block
PERFORM Set-Up-For-Refresh-Screen
END-EVALUATE
CLEAR オプションが選択された場合の画面をクリアは、ローカルに完結する操作であるため、サーバに接続する必要がなく、NULL 操作を使用します。以下のサーバプログラムの一部は、 RDT 機能の処理に必要なコードを示しています。 クライアント/サーバ結合では、 send-via-rdt フラグがセットされ、lnk-usr-fcode をチェックすることができます。 サーバ側のコードは次のようになります。
WHEN send-via-rdt
EVALUATE lnk-usr-fcode
WHEN 1
*--- LOAD 機能の場合、サーバプログラムは RDT 機能ではなく
*--- データ領域 customer-data-block を使用して、
*--- データファイルから顧客詳細情報を読み込んで、そのデータを
*--- クライアントに返送します。 RDT フラグが設定されていないと、クライアント/サーバ
*--- 結合は常に完全なデータ領域 (構成ファイルの
*--- dblksize で定義されている) をクライアントとサーバの
*--- の間で受け渡しします。
MOVE user-data-block TO customer-c-code
SET customer-load-flg-true TO TRUE
PERFORM ....... rest of program.......
WHEN 2
MOVE user-data-block TO customer-c-code
SET customer-del-flg-true TO TRUE
PERFORM ....... rest of program.......
END-EVALUATE
Csbind デモ用アプリケーションは RDT 機能を使用しています。
クライアント/サーバソリューションに付随する問題の 1 つとして、クライアント数の増加に伴うクライアントプログラムなどの、更新の煩雑さがあります。
オーバーライド機能 ( 『構成ファイルの各エントリのオーバーライド』の項を参照) を使用すると、各クライアントの構成ファイルを個別に書き換えずに、メンテナンス中のサーバから別のサーバに変更することができます。 オーバーライドはローカルでもリモートでも実行できますが、各クライアントのローカルのオーバーライドファイルのインストールまたは削除に時間がかかる場合があります。
mfcsmgr プログラムを使用すると、-i または -d オプションを使用して、クライアントにオーバーライドファイルをインストールまたは削除できます (詳しくは、 『サーバの管理』の項を参照してください)。 インストールまたは削除は、クライアントプログラムの終了時に行われます。
実際は、mfcsmgr プログラムで -i オプションを使用すると、オーバーライドファイルのみでなく、任意のファイルをクライアントシステム (クライアントのローカルディレクトリ) にインストールできます。 つまり、この方法で新たなスクリーンセットや最新プログラムファイルをインストールすれば、管理センターから各クライアントに更新データを配布できます。 セキュリティ上の理由から削除オプションはそれほど強化されておらず、削除できるのはオーバーライドファイル (mfcsovrd.cfg) に限られます。
-i オプションを使用してインストールするファイルはサーバ上になければなりません。 目的のファイルが mfserver を起動したディレクトリ内にある場合は、ファイル名だけを指定します。 別のディレクトリにある場合は、完全パス名で指定する必要があります。たとえば、 /u/live/update/newprog.int、d:\testprog.int、$LIVE/newtest.int はどれも有効ですが、$newfile という指定は無効です。
この機能を使用するためにプログラムを変更する必要はありません。 クライアントにはファイルが転送されたことを示すメッセージが表示され、システムログファイルに詳しい情報が書き込まれます。
クライアント/サーバ結合には制限事項はほとんどありませんが、次の点に注意してください。
Copyright © 2001 Micro Focus. All Rights Reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。
![]() | はじめに | CCI | ![]() |