次に本発明の実施の形態について図面を参照して詳細に説明する。
[第1の実施形態]
図1を参照すると、本発明の第1の実施形態は、クライアント5とサーバ6とがネットワーク7を介して相互に通信可能に接続されたコンピュータシステムである。
クライアント5は、メインフレームなどのコンピュータであり、業務プログラム51、52と、クライアントスタブ53とを有する。
業務プログラム51、52は、その処理の過程で外部のプロシージャを利用する。業務プログラム51と業務プログラム52とは、C言語とCOBOL言語のように、互いに言語が相違している。以下では、業務プログラム51の言語をG1、業務プログラム52の言語をG2と記す。業務プログラム51、52は、外部のプロシージャを利用する際、自業務プログラムの言語の識別情報とプロシージャの識別情報とプロシージャの引数とを含む要求51a1、52a1をクライアントスタブ53に送信する機能を有する。引数は、構造体型の引数であってもよいし、そうでなくてもよい。
クライアントスタブ53は、業務プログラム51、52から要求51a1、52a1を受信すると、その要求中の業務プログラムの言語の識別情報とプロシージャの識別情報とプロシージャの引数とを含む実行要求電文51a2、52a2をネットワーク7を通じてサーバ装置6へ送信する機能を有する。また、クライアントスタブ53は、サーバ装置6からネットワーク7経由で、実行要求電文51a2、52a2に対する応答電文51b2、52b2を受信すると、その応答電文中のプロシージャの戻り値を含む応答51b1、52b1を業務プログラム51、52に返却する機能を有する。
サーバ6は、オープンサーバなどのコンピュータであり、記憶手段61とサーバスタブ62とを有する。
記憶手段61は、言語の識別情報とプロシージャの識別情報との組合せに対応付けて、データ表現形式情報を記憶する機能を有する。データ表現形式情報は、プロシージャの引数および戻り値のデータサイズ、データ型などを表す情報である。
サーバスタブ62は、要求電文解析手段63と、プロシージャ実行手段64と、応答電文生成手段65とを有する。
要求電文解析手段63は、クライアント5からネットワーク7経由で受信した実行要求電文51a2、52a2に含まれる引数を、記憶手段61に記憶されたデータ表現形式情報を参照して、プロシージャ要求側のデータ表現形式からプロシージャ実行側のデータ表現形式に変換する機能を有する。
プロシージャ実行手段64は、要求電文解析手段63による変換後の引数を使用して、実行要求電文51a2、52a2に含まれるプロシージャの識別情報で特定されるプロシージャ(図示せず)を実行する機能を有する。プロシージャは、サーバ6上に存在するプロシージャであってもよいし、サーバ6に接続されたデータベースシステム上に存在するプロシージャであってもよい。
応答電文生成手段65は、記憶手段61に記憶されたデータ表現形式情報に基づいて、プロシージャの戻り値をプロシージャ実行側のデータ表現形式からプロシージャ要求側のデータ表現形式に逆変換し、この逆変換した戻り値を含む応答電文51b2、52b2をネットワーク7経由でクライアント5へ送信する機能を有する。
次に本実施形態の動作を説明する。
今、業務プログラム51、52が利用するプロシージャの識別情報をFUNC1とする。このとき、サーバ装置6の記憶手段61には、業務プログラム51の言語G1とプロシージャの識別情報FUNC1との組合せに対応付けて、プロシージャ実行側の引数および戻り値がどのようなデータ表現形式であるかを定義したデータ表現形式情報G1-FUNC1が記憶され、また、業務プログラム52の言語G2とプロシージャの識別情報FUNC1との組合せに対応付けて、プロシージャ要求側の引数および戻り値がどのようなデータ表現形式であるかを定義したデータ表現形式情報G2-FUNC1が記憶され、さらに、サーバスタブ62の言語(G3と記す)の識別情報とプロシージャの識別情報FUNC1との組合せに対応付けて、プロシージャ実行側の引数および戻り値がどのような形式であるかを定義したデータ表現形式情報G3-FUNC1が記憶されている。
クライアント5の業務プログラム51から要求51a1が送信されると、クライアントスタブ53がそれを受信し、実行要求電文51a2をネットワーク7経由でサーバ装置6に送信する。サーバ装置6のサーバスタブ62における要求電文解析手段63は、実行要求電文51a2を受信すると、その電文中の言語G1の識別情報とプロシージャの識別情報FUNC1との組合せに対応するデータ表現形式情報G1-FUNC1と、サーバスタブ62の言語G3の識別情報とプロシージャの識別情報FUNC1との組合せに対応するデータ表現形式情報G3-FUNC1とを記憶手段61から読み出し、これらのデータ表現形式情報G1-FUNC1、G3-FUNC1に基づいて、実行要求電文51a2中のプロシージャの引数のデータ表現形式を、プロシージャ要求側のデータ表現形式からプロシージャ実行側のデータ表現形式に変換する。そして、要求電文解析手段63は、変換後の引数とプロシージャの識別情報FUNC1とをプロシージャ実行手段64に通知する。プロシージャ実行手段64は、通知された識別情報FUNC1で特定されるプロシージャを上記変換後の引数を使用して実行する。
プロシージャ実行手段64は、プロシージャの実行完了後、その戻り値を応答電文生成手段65に通知する。応答電文生成手段65は、記憶手段61からデータ表現形式情報G1-FUNC1、G3-FUNC1を読み出し、これらのデータ表現形式情報G1-FUNC1、G3-FUNC1に基づいて、プロシージャの戻り値のデータ表現形式を、プロシージャ実行側のデータ表現形式からプロシージャ要求側のデータ表現形式に変換する。そして、応答電文生成手段65は、変換後の戻り値を含む応答電文51b2を生成し、ネットワーク7経由でクライアント5へ返却する。クライアント5のクライアントスタブ53は、受信した応答電文51b2に含まれる戻り値を含む応答51b1を業務プログラム51に返却する。
クライアント5の業務プログラム52から要求52a1が送信されたときの動作は、業務プログラム51から要求51a1が送信されたときの動作とほぼ同じである。ただし、サーバ6の要求電文解析手段63は、記憶手段61から言語G2の識別情報とプロシージャの識別情報FUNC1との組合せに対応するデータ表現形式情報G2-FUNC1と、サーバスタブ62の言語G3の識別情報とプロシージャの識別情報FUNC1との組合せに対応するデータ表現形式情報G3-FUNC1とを読み出し、これらのデータ表現形式情報G2-FUNC1、G3-FUNC1に基づいて、実行要求電文52a2中のプロシージャの引数のデータ表現形式を、プロシージャ要求側のデータ表現形式からプロシージャ実行側のデータ表現形式に変換する。また、応答電文生成手段65は、記憶手段61中のデータ表現形式情報G2-FUNC1、G3-FUNC1に基づいて、プロシージャの戻り値のデータ表現形式を、プロシージャ実行側のデータ表現形式からプロシージャ要求側のデータ表現形式に変換する。
このように本実施形態によれば、一つのクライアント5に複数種類のデータ表現形式が存在する場合であっても、データ表現形式の変換をクライアント5側で実施する必要がなく、クライアント5の負荷を軽減することができる。その理由は、サーバ6の記憶手段61に、業務プログラムの言語の識別情報とプロシージャの識別情報との組合せに対応付けてデータ表現形式情報を保持しているため、同じクライアント5に種類の異なるデータ表現形式が存在しても対応できるためである。
また、本実施形態によれば、言語の識別情報とプロシージャの識別情報との組合せに対応付けてデータ表現形式情報を保持するため、引数として構造体型の引数を使用している場合でも対応が可能である。すなわち、複数のデータ型で構成される構造体データは、構造体内の変数の開始オフセットを最適化するために、実装言語によっては、変数と変数の間にダミーの領域(パディング)が挿入されるが、このダミーの領域に関する情報をデータ表現形式情報に含めておくことによって、構造体データに対応することができる。
[第2の実施形態]
[構成の説明]
図2を参照すると、クライアント1は、パラメータ定義ソース格納領域11と、クライアントスタブ12と、業務プログラム13で構成されるコンピュータシステムである。
クライアント1は、軽量でシンプルな構造のクライアントスタブ12によるプロシージャの遠隔実行を要求するクライアントであり、メインフレームのようなCPU使用量と開発コストを抑えたいプラットフォームへの適用を想定している。
業務プログラム13は、プロシージャの遠隔実行を要求するプログラムである。COBOLやC言語など、任意の言語で実装されていて、処理する業務に応じて存在し、同時に実行される可能性がある。
パラメータ定義ソース格納領域11は、パラメータ定義ソース111を格納する領域であり、クライアント1のファイルシステムに構築する。パラメータ定義ソース111は、業務プログラム13が、プロシージャを実行要求するときに指定するパラメータを定義するプログラムソースであり、実行要求するプロシージャと業務プログラム13の実装言語ごとに用意する。さらに、図3の実行要求を処理するサーバ2のプロシージャ23のパラメータ定義にも使用するため、プロシージャ23の実装言語に対応するプログラムソースも用意する。
パラメータ定義ソース111は、業務プログラム本体のソースとは分離可能かつ、業務プログラムのコンパイル時には本体のソースにマージ可能な形式とする。例えば、業務プログラムがCOBOLの場合は、コピー原文が相当し、C言語の場合は、ヘッダファイルが相当する。
本実施形態では、実行要求するプロシージャと、パラメータ定義ソースのファイルとを対応づけるために、パラメータ定義ソースの拡張子を除いたファイル名は、対応づけるプロシージャ名と同名とする。さらに、ひとつのプロシージャに、複数の言語のパラメータ定義ソースが対応するため、言語別にパラメータ定義ソースの格納ディレクトリを作成する。
例えば、業務プログラムがC言語で実装されていて、「FUNC1」とう名前のプロシージャに対応するパラメータ定義ソースの場合、ファイルのパスは「〜/C/FUNC1.h」である。また、業務プログラムがCOBOLで実装されていて、「FUNC1」とう名前のプロシージャに対応するパラメータ定義ソースの場合、ファイルのパスは「〜/COBOL/FUNC1.CBL」である。
パラメータ定義ソース111は、IDLのようなインタフェース記述言語を使用して、汎用インタフェース定義から自動生成してもよいし、プログラマがプロシージャのパラメータ形式にあわせて記述してもよい。
ひとつのパラメータ定義ソースには、対応するプロシージャのパラメータを、ひとつの構造体で記述する。このパラメータ構造体は、入力と出力を兼ねたものであり、プロシージャは、業務プログラムが構造体にセットした値を入力パラメータとして参照し、構造体の値を書き換えて、出力パラメータとして業務プログラムに返却する。
例えば、C言語の整数と文字列のパラメータ定義は次のとおりである。
struct param {
int param1;
char param2[100];
};
typedef struct param param;
また、COBOLの整数と文字列のパラメータ定義は次のとおりである。
01 PARAM.
02 PARAM1 PIC S9(10).
02 PARAM2 PIC X(100).
クライアントスタブ12は、業務プログラム13から、実行要求するプロシージャを識別する情報と、プロシージャのパラメータ構造体のデータとを受け取り、業務プログラム13の実装言語を識別する情報を付加したうえで、実行要求手段121を使用して、サーバ2にプロシージャの遠隔実行を要求する手段である。複数のプログラム言語に対応するために、複数の言語のインタフェースを持つ。業務プログラム13は、実装言語に対応するインタフェースをリンクして使用する。
実行要求手段121は、業務プログラム13の実装言語を識別する情報と、実行要求するプロシージャを識別する情報と、実行要求のパラメータ構造体のデータとを含む実行要求電文を、ネットワーク4を経由して、サーバ2に送信する。さらに、その応答として、プロシージャの実行状態を識別する情報と、プロシージャの実行により更新された構造体データを含む実行応答電文を受信して、業務プログラム13に結果を返却する手段である。
図3を参照すると、サーバ2は、パラメータ定義ソース格納領域21と、サーバスタブ22と、プロシージャ23と、プロシージャ登録テーブル24とで構成されるコンピュータシステムである。
サーバ2は、クライアント1からのプロシージャの実行要求を処理するサーバであり、クライアント1より実行性能の高いプラットフォームへの適用を想定している。
パラメータ定義ソース格納領域21は、パラメータ定義ソース211を格納する領域であり、サーバ2のファイルシステムに構築する。クライアント1のパラメータ定義ソース格納領域11と同じディレクトリ構成とし、クライアント1のパラメータ定義ソース111と同じ名前かつ、同じ内容のファイルを、パラメータ定義ソース211として格納する。なお、パラメータ定義ソース格納領域21は、クライアント1とサーバ2の共有ディスクに配置して、それぞれが同一の領域を参照する構成でもよい。
サーバスタブ22は、電文解析手段221と、プロシージャ実行手段222と、応答電文生成手段223と、パラメータ定義ソース解析手段224とを備えて、クライアント1からのプロシージャ実行要求を受け付け、プロシージャ23を実行して応答を返却するプログラムである。
要求電文解析手段221は、クライアント1から、業務プログラム13の実装言語を識別する情報と、実行要求するプロシージャを識別する情報と、実行要求のパラメータ構造体のデータとを含む実行要求電文を、ネットワーク4を介して受信し、パラメータ定義ソース解析手段224を使用して、実行要求されたプロシージャに対応するパラメータ構造体の構造とデータ形式を明らかにして、実行要求電文のパラメータ構造体のデータを、サーバプラットフォームの形式に変換する手段である。
プロシージャ実行手段222は、プロシージャ登録テーブル24を参照して実行するプロシージャ23を特定し、特定したプロシージャ23を、要求電文解析手段221で変換したパラメータ構造体のデータを使用して実行し、プロシージャ23によって更新されたパラメータ構造体のデータを実行結果として取得する手段である。
応答電文生成手段223は、パラメータ定義ソース解析手段224を使用して、実行要求されたプロシージャに対応するパラメータ構造体の構造とデータ形式を明らかにして、プロシージャ実行手段222が取得したパラメータ構造体のデータを、クライアントプラットフォームの形式に変換する。さらに、プロシージャの実行状態を識別する情報と、変換したパラメータ構造体のデータを含む要求応答電文を生成し、ネットワーク4を介して、クライアント1に要求応答電文を送信する手段である。
パラメータ定義ソース解析手段224は、パラメータ定義ソース211に定義されているパラメータ構造体の構造とデータ形式を解析する手段である。処理効率化のため、一度解析したパラメータ構造体の解析結果は、ファイルやメモリにキャッシュしてもよい。同じパラメータ定義ソースに対して複数回の解析を行うことなく、キャッシュに保存した解析結果を使用すると効率がよい。
プロシージャ23は、クライアント1からの要求により実行する手続きであり、複数あってもよく、サーバスタブ22と同じ言語で実装する。
プロシージャ登録テーブル24は、プロシージャ名と実行するプロシージャ23を対応づけるテーブルであり、サーバスタブ22と同じ言語で記述する。実行するプロシージャを識別する情報と、実行に必要なプロシージャのアドレスの組を1レコードとして、複数のレコードで構成する。
本実施形態では、サーバスタブ22と、プロシージャ23と、プロシージャ登録テーブル24の実装言語をC言語とする。
プロシージャ登録テーブル24のプロシージャを識別する情報にはプロシージャ名を示す文字列を格納し、プロシージャのアドレスには関数ポインタを格納する。
なお、C言語は、コンパイル時に実行する手続きを確定する必要があるため、プロシージャ23と、プロシージャ23の関数ポインタを格納するプロシージャ登録テーブル24は、同時にコンパイルする必要がある。コンパイルしたプロシージャ23と、プロシージャ登録テーブル24は、サーバスタブ22にリンクして、サーバスタブ22から、プロシージャ名を使用してプロシージャ23を呼び出せる構成にする。
なお、Javaのリフレクションのように、名前から動的に手続きを実行できる仕組みを備えた言語でサーバスタブ22を実装する場合は、事前のリンクやプロシージャ登録テーブル24は不要である。
[動作の説明]
図2を使用してクライアント1の動作を説明する。
業務プログラム13は、実行要求するプロシージャを識別する情報と、プロシージャのパラメータ構造体のデータを入力にして、クライアントスタブ12の手続きを呼び出す。
プロシージャを識別する情報は、クライアント1とサーバ2の間で取り決めておけば、数値の形式でも、文字列の形式でもよい。本実施形態では、サーバ2において、プロシージャ登録テーブル24のプロシージャを識別する情報と、プロシージャ23とパラメータ定義ソース211との対応づけにプロシージャ名を使用するため、プロシージャを識別する情報は文字列の形式とする。文字コードについては、クライアント1とサーバ2の間で取り決めておけば任意であるが、クライアント1のCPU使用量を抑えることが本実施形態の主目的なので、クライアント1がローカルに使用する文字コードを使用する。
なお、実行要求するプロシージャのパラメータ構造体は、パラメータ定義ソース111で定義しているため、業務プログラム13のソースとあわせてコンパイルすることにより、業務プログラム13は、パラメータ構造体をローカル変数としてアクセスできる。
クライアントスタブ12は、業務プログラム13の実装言語を識別する情報と、実行要求するプロシージャを識別する情報と、プロシージャのパラメータ構造体のデータを入力にして実行要求手段121を呼び出す。業務プログラム13の言語を識別する情報は、クライアント1とサーバ2の間で取り決めておけば、数値の形式でも、文字列の形式でもよい。本実施形態では、サーバ2において、プロシージャとパラメータ定義ソースの対応づけに、実装言語の名前を使用するため、実装言語を識別する情報は文字列の形式とする。文字列コードについては、クライアント1とサーバ2の間で取り決めておけば任意であるが、クライアント1のCPU使用量を抑えることが本実施形態の主目的なので、クライアント1がローカルに使用する文字コードを使用する。
実行要求手段121は、業務プログラム13の言語を識別する情報と、実行要求するプロシージャを識別する情報と、プロシージャのパラメータ構造体のデータを含む実行要求電文を作成する。実行要求電文の形式は、クライアント1とサーバ2の間で取り決めておく。なお、パラメータ構造体のデータは整列化(データ表現形式変換)しないため、クライアント1の業務プログラム13の実装言語のデータ形式となっている。
作成した実行要求電文は、ネットワークを経由してサーバ2に送信し、サーバ2のプロシージャ23の実行状態を識別する情報と、プロシージャ23が更新したパラメータ構造体のデータとを含む実行応答電文の受信を待ち合わせる。実行要電文の形式は、クライアント1とサーバ2の間で取り決めておく。
実行応答電文を受信すると、電文からプロシージャの実行状態を識別する情報と、プロシージャの実行によって更新されたパラメータ構造体を取り出す。プロシージャの実行状態を識別する情報は、クライアント1とサーバ2の間で取り決めておけば、数値の形式でも、文字列の形式でもよく、本実施形態では数値の形式とする。例えば、プロシージャの実行が完了した場合は「0」を、プロシージャが登録されておらず実行できなかった場合は「1」を、プロシージャの実行中に例外が発生した場合は「2」を、パラメータ構造体の変換に失敗してプロシージャを実行できなかった場合は「3」を、プロシージャ実行後のパラメータ構造体の変換に失敗した場合は「4」を割り当てる。なお、数値のエンディアンは、クライアント1とサーバ2の間で取り決めておけば任意であるが、クライアント1のCPU使用量を抑えることが本実施形態の主目的なので、クライアント1がローカルに使用するエンディアンを使用する。
電文から取り出したプロシージャの実行状態を識別する情報は、クライアント1がローカルに使用するエンディアンで格納されているため、業務プログラム13にそのまま返却する。また、電文から取り出したパラメータ構造体のデータは、サーバ2でクライアント1の業務プログラム13の実装言語のデータ形式に変換されているため、業務プログラム13にそのまま返却する。
返却されたパラメータ構造体は、パラメータ定義ソース111で定義しているため、業務プログラム13のソースとあわせてコンパイルすることにより、業務プログラム13は、パラメータ構造体を、ローカル変数としてアクセスできる。
図3を使用してサーバ2の動作を説明する。
サーバスタブ22は、要求電文解析手段221を使用して、クライアント1からの実行要求電文の受信を待ち合わせる。実行要求電文を受信すると、要求電文解析手段221は、クライアント1とサーバ2の間の取り決めに従って、クライアント1の業務プログラム13の実装言語を識別する情報と、実行要求されたプロシージャを識別する情報と、プロシージャのパラメータ構造体のデータとを実行要求電文から取り出す。
要求電文解析手段221は、業務プログラム13の実装言語を識別する情報と、実行要求されたプロシージャ23を識別する情報から、業務プログラム13が使用するパラメータ定義ソース211を特定する。
また、サーバスタブ22の実装言語を識別する情報と、実行要求されたプロシージャ23を識別する情報から、プロシージャ23が使用するパラメータ定義ソース211を特定する。
業務プログラム13が使用するパラメータ定義ソース211と、プロシージャ23が使用するパラメータ定義ソース211を、パラメータ定義ソース解析手段224を使用してそれぞれ解析する。解析によって、それぞれの構造体に定義されている各変数について、構造体データの先頭からの開始オフセットとデータサイズ、および、データ形式を明らかにする。開始オフセットとデータサイズを明らかにする理由は、実装言語のデータ型によって異なる変数のサイズや、実装言語によって異なる構造体のパディングの違いを吸収するためである。変数のデータ形式を明らかにする理由は、実装言語のデータ型によって異なる格納形式の違いを吸収するためである。
例えば、COBOLの数値を格納する変数には複数のデータ型が存在し、データ型によって数値の格納形式が異なる。外部10進数で格納されていたり、内部10進数で格納されていたり、2進数で格納されていたりするため、それぞれに対応した変換ルールでサーバプラットフォームの形式に変換する必要がある。
また、COBOLの文字列を格納する変数には複数のデータ型が存在し、データ型によって文字列の格納形式が異なる。全てANK文字で構成されていたり、ANK文字と2バイト文字が混在して、ANK文字と2バイト文字が漢字INコードと漢字OUTコードで区切られる形式で構成されていたり、全て2バイト文字で構成されていて、漢字INコードと漢字OUTコードが付加されない形式で構成されていたりするため、それぞれに対応したルールでサーバプラットフォームの文字コードに変換する必要がある。
パラメータ定義ソースの構造を明らかにした上で、業務プログラム13が使用するパラメータ定義ソース211の形式で格納されているデータを、プロシージャ23が使用するパラメータ定義ソース211の形式に変換する。業務プログラム13とプロシージャ23のパラメータ定義ソースの構造体に定義されている各変数は、それぞれ定義順に対応しているとみなして、変数ごとに変換する。
例えば、業務プログラム13の実装言語がCOBOLで、サーバスタブ22の実装言語がC言語で、COBOLのコピー原文の変数が外部10進数で、対応するC言語の構造体の変数がchar型の配列の場合、外部10進数の各桁を、数値を表す文字に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が外部10進数で、対応するC言語の構造体の変数がint型の場合、外部10進数を、サーバプラットフォームのエンディアンの4バイト2進数の形式に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が内部10進数で、対応するC言語の構造体の変数がchar型の配列の場合、内部10進数の各桁を、数値を表す文字に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が内部10進数で、対応するC言語の構造体の変数がint型の場合、内部10進数を、サーバプラットフォームのエンディアンの4バイト2進数の形式に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が2進数で、対応するC言語の構造体の変数がchar型の配列の場合、2進数を10進数で表現したときの各桁を、数値を表す文字に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が2進数で、対応するC言語の構造体の変数がint型の場合、2進数を、サーバプラットフォームのエンディアンの4バイト2進数の形式に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が文字列で、対応するC言語の構造体の変数がchar型の配列の場合、文字列を、サーバプラットフォームの文字コードに変換して、C言語の構造体の対応する変数のオフセットにコピーする。
また、COBOLのコピー原文の変数が文字列で、対応するC言語の構造体の変数がint型の配列の場合、文字列が数値を表す文字で構成されていれば、文字列の各桁を数値とみなして、サーバプラットフォームのエンディアンの4バイト2進数の形式に変換して、C言語の構造体の対応する変数のオフセットにコピーする。
パラメータ構造体に定義された全ての変数について変換が成功した場合は、変換したパラメータ構造体を返却する。また、変換に失敗した場合は、プロシージャの実行状態を識別する情報として、パラメータ構造体の変換に失敗してプロシージャを実行できなかったことを意味する値「3」を返却する。
なお、パラメータ構造体の変換に失敗するケースには、例えば、業務プログラム13とプロシージャ23が使用するパラメータ構造体の変数の数が合わない場合や、数値を表す文字で構成されていない文字列を、数値型の変数に変換しようとした場合などがある。
サーバスタブ22は、要求電文解析手段221でパラメータ構造体の変換に失敗した場合、プロシージャの実行状態を識別する情報と、応答電文生成手段223を使用して、クライアント1に実行応答電文を送信する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
要求電文解析手段221でパラメータ構造体の変換に成功した場合、プロシージャを識別する情報と、要求電文解析手段221で変換したパラメータ構造体のデータと、プロシージャ実行手段222を使用して、実行要求されたプロシージャを実行する。
プロシージャ実行手段222は、プロシージャを識別する情報をキーにしてプロシージャ登録テーブル24を検索する。対応するレコードがなければ、プロシージャの実行状態を識別する情報として、プロシージャが登録されておらず実行できなかったことを意味する値「1」を返却する。対応するレコードがあれば、該当レコードに登録されているプロシージャのアドレスを示す関数ポインタを使用して、プロシージャ23を実行する。プロシージャ23の引数となるパラメータ構造体のデータは、プロシージャ23の内部で更新できるように参照渡しとする。なお、引数となるパラメータ構造体は、パラメータ定義ソース111で定義しているため、プロシージャ23のソースとあわせてコンパイルすることにより、プロシージャ23は、パラメータ構造体をローカル変数としてアクセスできる。
プロシージャ23の実行中に例外が発生した場合は、プロシージャの実行状態を識別する情報として、プロシージャの実行中に例外が発生したことを意味する値「2」を返却する。
プロシージャ23の実行が完了した場合は、プロシージャの実行状態を識別する情報として、プロシージャの実行が完了したことを意味する値「0」と、プロシージャ23によって更新されたパラメータ構造体のデータを返却する。
サーバスタブ22は、プロシージャの実行状態を識別する情報と、プロシージャ23によって更新されたパラメータ構造体のデータと、応答電文生成手段223を使用して、クライアント1に実行応答電文を送信する。
応答電文生成手段223は、プロシージャの実行状態を識別する情報が、プロシージャの実行が完了したことを意味する値「0」でない場合、プロシージャの実行がなんらかの理由で失敗しているため、プロシージャの実行状態を識別する情報のみを含む実行応答電文を作成して、ネットワークを介して、クライアント1に送信する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
応答電文生成手段223は、プロシージャの実行状態を識別する情報が、プロシージャの実行が完了したことを意味する値「0」の場合、プロシージャ23によって更新されたパラメータ構造体のデータ変換を行う。
要求電文解析手段221と同様に、パラメータ定義ソース解析手段224を使用して、業務プログラム13が使用するパラメータ定義ソース211と、プロシージャ23が使用するパラメータ定義ソース211とをそれぞれ解析する。
解析によって、それぞれの構造体に定義されている各変数について、構造体データの先頭からの開始オフセットとデータサイズ、および、データ形式を明らかにする。
パラメータ定義ソースの構造を明らかにした上で、プロシージャ23が使用するパラメータ定義ソース211の形式で格納されているデータを、業務プログラム13が使用するパラメータ定義ソース211の形式に変換する。業務プログラム13とプロシージャ23のパラメータ定義ソースの構造体に定義されている各変数は、それぞれ定義順に対応しているとみなして、変数ごとに変換する。
例えば、業務プログラム13の実装言語がCOBOLで、サーバスタブ22の実装言語がC言語で、COBOLのコピー原文の変数が外部10進数で、対応するC言語の構造体の変数がchar型の配列の場合、char型の配列が数値を表す文字で構成されていれば、char型の配列の各桁の文字を数値とみなし、COBOLの外部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が外部10進数で、対応するC言語の構造体の変数がint型の配列の場合、int型を10進数で表現したときの各桁を、外部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が内部10進数で、対応するC言語の構造体の変数がchar型の配列の場合、char型の配列が数値を表す文字で構成されていれば、char型の配列の各桁の文字を数値とみなし、COBOLの内部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が内部10進数で、対応するC言語の構造体の変数がint型の配列の場合、int型を10進数で表現したときの各桁を、内部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が2進数で、対応するC言語の構造体の変数がchar型の配列の場合、char型の配列が数値を表す文字で構成されていれば、char型の配列の各桁の文字を数値とみなし、クライアントプラットフォームのエンディアンで、COBOLの2進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が2進数で、対応するC言語の構造体の変数がint型の配列の場合、int型をクライアントプラットフォームのエンディアンで、COBOLの2進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が文字列で、対応するC言語の構造体の変数がchar型の配列の場合、文字列を、クライアントプラットフォームの文字コードに変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が文字列で、対応するC言語の構造体の変数がint型の配列の場合、int型を10進数で表現したときの各桁を、クライアントプラットフォームの文字コードで、数値を表す文字に変換して、コピー原文の対応するオフセットにコピーする。
パラメータ構造体に定義された全ての変数について変換が成功した場合は、変換したパラメータ構造体と、プロシージャの実行状態を識別する情報として、プロシージャの実行が完了したことを意味する値「0」を含む実行応答電文を作成する。実行応答電文は、ネットワークを介して、クライアント1に送信する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
また、変換に失敗した場合は、プロシージャの実行状態を識別する情報として、プロシージャ実行後のパラメータ構造体の変換に失敗したことを意味する値「4」を含む実行応答電文を作成する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
[効果の説明]
第1の効果は、サーバと比較してクライアントの実行性能が低く、両者の性能差が大きいシステムにおいて、クライアントの処理がボトルネックになり難く、全体の実行効率が一般的なRPC技術に比べて高くなる点である。その理由は、クライアントスタブ12において、パラメータの整列化と非整列化(パラメータのデータ表現形式の変換と逆変換)を行わないため、クライアント1の処理は、データの移送とネットワークへのデータ送信のみとなり、一般的なRPC技術より、クライアントのCPU使用量が少ない構成を実現できるからである。サーバ2にパラメータ定義ソース解析手段224が必要になるが、サーバ2の実行性能の方が優れている前提なので問題にならない。
第2の効果は、CPU利用量に応じて課金される料金体系のクライアントにおいて、一般的なRPC技術に比べて、CPU利用量が少なくなり運用コストを抑えられる点である。その理由は、クライアントスタブ12において、パラメータの整列化と非整列化(パラメータのデータ表現形式の変換と逆変換)を行わないため、クライアント1の処理は、データの移送とネットワークへのデータ送信のみとなり、一般的なRPC技術より、クライアントのCPU使用量が少ない構成を実現できるからである。
第3の効果は、ソフトウエア開発の生産性が低いクライアントにおいて、一般的なRPC技術に比べて、クライアントスタブ12の開発コストを抑えられる点である。その理由は、クライアントスタブ12において、パラメータの整列化と非整列化(パラメータのデータ表現形式の変換と逆変換)を行わないため、クライアント1の処理は、データの移送とネットワークへのデータ送信のみとなり、一般的なRPC技術より、シンプルな構成を実現できるからである。
第4の効果は、クライアントの業務アプリケーションの実装言語を特定せず、様々な実装言語に対応できる点である。その理由は、実行要求のパラメータ構造体のデータの解析に、業務アプリケーションのソースプログラムを使用するからである。ソースを使用して構造体のデータを解析することにより、実装言語によって異なる構造体のパディングの違いや、データの表現形式の違いを吸収できる。
[第3の実施形態]
図3の構成では、実行できる手続きは、サーバ2のプロシージャに限られている。近年のオープンサーバには、優れたDBMS(DataBase Management System)が実現されており、メインフレームの業務プログラムから、これらのデータベースをダイレクトにアクセスするニーズが高まっている。本実施形態では、図2のクライアントの構成を変えずに、データベースサーバのストアドプロシージャを実行できるようにする。
図4を参照すると、本実施形態は、第2の実施形態におけるサーバ2のプロシージャ23とプロシージャ登録テーブル24を、データベースアクセス手段25に置き換えている。また、サーバ2には、データベースサーバ3がネットワークを介して接続されている。
サーバ2のデータベースアクセス手段25は、ネットワークを経由して、データベースサーバ3のデータベース管理手段31に、データベース33のアクセスや、ストアドプロシージャ32の実行を要求する手段である。本実施形態では、プロシージャ実行手段222から、データベースサーバ3のストアドプロシージャ32の実行を要求するために使用する。サーバスタブ22の実装言語をJava(登録商標)とし、データベースアクセス手段25は、JDBCドライバを使用する。
データベースサーバ3は、データベース管理手段31と、ストアドプロシージャ32と、データベース33を備えるコンピュータシステムである。
データベース管理手段31は、一般的なDBMSが相当する。データベース33を管理し、データ形式やアクセス手段を標準化して、特定のアプリケーションからデータを独立させる役割や、データのアクセス要求に応じて、必要なデータをデータベース33から取得して返却する機能を持つ。本実施形態では、データのアクセス要求として、ストアドプロシージャ32の実行要求を処理する。
ストアドプロシージャ32は、データベースに対する一連の処理をまとめた手続きであり、処理のなかで、データベース33をアクセスすることができる。
データベース33は、データベース管理手段31によって標準化されたデータを保持する領域であり、データベースサーバ3のファイルシステムに構築する。
本実施形態の動作を説明する。
第2の実施形態と比較して、クライアント1の動作に相違点はない。クライアント1の業務プログラム13は、実行要求するストアドプロシージャを識別する情報と、プロシージャのパラメータ構造体のデータを入力にして、クライアントスタブ12の手続きを呼び出し、ストアドプロシージャの実行が完了すると、ストアドプロシージャの実行状態を識別する情報とストアドプロシージャが更新したパラメータ構造体のデータを受け取る。
なお、ストアドプロシージャの実行には、パラメータの入力と出力の方向を明確にする必要があるため、クライアント1とサーバ2の間で、方向を指定する方法を取り決める必要がある。本実施形態では、パラメータ定義ソースのパラメータ構造体の変数の名前によって方向を指定する。変数が入力の場合、変数名の先頭に「IN_」という文字列を付加する。変数が出力の場合、変数名の先頭に「OU_」という文字列を付加する。変数が入出力の場合、変数名の先頭に「IO_」という文字列を付加する。
例えば、パラメータ定義ソースがCOBOLのコピー原文の場合、入力パラメータである整数と、出力パラメータである整数と、入出力パラメータである整数は、それぞれ次のように定義する。
01 PARAM.
02 IN_PARAM1 PIC S9(10).
02 OU_PARAM2 PIC S9(10).
02 IO_PARAM3 PIC S9(10).
図4を参照してサーバ2の動作を説明する。第2の実施形態との相違点は、要求電文解析手段221と、プロシージャ実行手段222と、応答電文生成手段223の動作である。
要求電文解析手段221は、業務プログラム13の実装言語を識別する情報と、実行要求されたストアドプロシージャを識別する情報から、業務プログラム13が使用するパラメータ定義ソース211を特定して、パラメータ定義ソース解析手段224を使用して解析する。
パラメータ定義ソースの構造を明らかにした上で、業務プログラム13が使用するパラメータ定義ソース211の形式で格納されているデータを、サーバスタブ22の実装言語であるJavaのオブジェクトに変換する。ここでは、要求電文解析手段221はJavaのオブジェクトのデータ表現形式情報を保持していることを前提としているが、第2の実施形態と同様にプロシージャ実行側の言語の識別情報とプロシージャの識別情報との組合せに対応するパラメータ定義ソース211をパラメータ定義ソース解析手段224で解析して、Javaのオブジェクトのデータ表現形式情報を取得するようにしても良い。後述する応答電文生成手段223の場合も同様である。
パラメータ構造体の入力および、入出力の変数について、定義順にオブジェクトに変換する。例えば、業務プログラム13の実装言語がCOBOLで、コピー原文の変数が外部10進数や、内部10進数や、2進数など、数値変数の場合、COBOLの数値形式を解析してBigDecimalオブジェクトに変換する。また、コピー原文の変数が文字列の場合、クライアント1の文字コードから、Javaの文字コードであるUNICODEへの文字コード変換を行い、Stringオブジェクトに変換する。
パラメータ構造体に定義された全ての入力および、入出力の変数について、オブジェクトへの変換が成功した場合は、変換したオブジェクトを返却する。変換に失敗した場合は、ストアドプロシージャの実行状態を識別する情報として、パラメータ構造体の変換に失敗してストアドプロシージャを実行できなかったことを意味する値「3」を返却する。
プロシージャ実行手段222は、ストアドプロシージャを識別する情報であるストアドプロシージャ名と、要求電文解析手段221で変換した入力および、入出力パラメータとなるJavaオブジェクトと、データベースアクセス手段25とを使用して、データベースサーバ3のデータベース管理手段31に、ストアドプロシージャ32の実行要求を行う。
データベースアクセス手段25を使用して実行要求するとき、ストアドプロシージャのパラメータの個数の情報と、入力および、入出力パラメータとして指定するJavaオブジェクトが、それぞれ何番目のパラメータとなるかの指定が必要である。パラメータの個数は、パラメータ構造体に定義された変数の数とする。Javaオブジェクトのパラメータの順序は、Javaオブジェクトに対応するパラメータ構造体の変数の定義順とする。
データベース管理手段31は、データベースアクセス手段25からの実行要求に応じてストアドプロシージャ32を実行する。ストアドプロシージャ32は、プロシージャ実行手段222が指定した、入力および、入出力パラメータを参照して処理を行い、出力および、入出力パラメータを更新する。
ストアドプロシージャ32の実行が失敗した場合、プロシージャ実行手段222は、データベースアクセス手段25から、例外情報を受け取るので、ストアドプロシージャの実行状態を識別する情報として、プロシージャの実行中に例外が発生したことを意味する値「2」を返却する。なお、ストアドプロシージャの実行が失敗するケースには、例えば、ストアドプロシージャがデータベース管理手段31に登録されていなかった場合や、プロシージャ実行手段222が実行要求のときに指定したパラメータの個数や、入出力の方向が、実行するストアドプロシージャ32と一致しなかった場合などがある。
ストアドプロシージャ32の処理が完了すると、プロシージャ実行手段222は、データベースアクセス手段25から、ストアドプロシージャの出力および、入出力パラメータを、Javaオブジェクトの形式で受けとる。ストアドプロシージャの実行状態を識別する情報として、ストアドプロシージャの実行が完了したことを意味する値「0」と、ストアドプロシージャ32の実行結果のJavaオブジェクトを返却する。
応答電文生成手段223は、ストアドプロシージャの実行状態を識別する情報が、ストアドプロシージャの実行が完了したことを意味する値「0」でない場合、ストアドプロシージャの実行がなんらかの理由で失敗しているため、ストアドプロシージャの実行状態を識別する情報のみを含む実行応答電文を作成して、ネットワークを介して、クライアント1に送信する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
応答電文生成手段223は、ストアドプロシージャの実行状態を識別する情報が、ストアドプロシージャの実行が完了したことを意味する値「0」の場合、ストアドプロシージャ23の実行結果のJavaオブジェクトの変換を行う。
要求電文解析手段221と同様に、パラメータ定義ソース解析手段224を使用して、業務プログラム13が使用するパラメータ定義ソース211を解析する。
パラメータ定義ソースの構造を明らかにした上で、ストアドプロシージャ23の実行結果のJavaオブジェクトを、業務プログラム13が使用するパラメータ定義ソース211の形式に変換する。
例えば、業務プログラム13の実装言語がCOBOLで、コピー原文の変数が外部10進数で、対応するJavaオブジェクトがBigDecimalオブジェクトの場合、BigDecimalオブジェクトの値を、COBOLの外部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、コピー原文の変数が外部10進数で、対応するJavaオブジェクトがStringオブジェクトの場合、文字列の各桁の文字を数値とみなし、COBOLの外部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、コピー原文の変数が内部10進数で、対応するJavaオブジェクトがBigDecimalオブジェクトの場合、BigDecimalオブジェクトの値を、COBOLの内部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、コピー原文の変数が内部10進数で、対応するJavaオブジェクトがStringオブジェクトの場合、文字列の各桁の文字を数値とみなし、COBOLの内部10進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、コピー原文の変数が2進数で、対応するJavaオブジェクトがBigDecimalオブジェクトの場合、BigDecimalオブジェクトの値を、クライアントプラットフォームのエンディアンで、COBOLの2進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、コピー原文の変数が2進数で、対応するJavaオブジェクトがStringオブジェクトの場合、文字列の各桁の文字を数値とみなし、クライアントプラットフォームのエンディアンで、COBOLの2進数の形式に変換して、コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が文字列で、対応するJavaオブジェクトがBigDecimalオブジェクトの場合、BigDecimalオブジェクトの値を10進数で表現したときの各桁を、クライアントプラットフォームの文字コードで、数値を表す文字に変換して、
コピー原文の対応するオフセットにコピーする。
また、COBOLのコピー原文の変数が文字列で、対応するJavaオブジェクトがStringオブジェクトの場合、文字列を、クライアントプラットフォームの文字コードに変換して、コピー原文の対応するオフセットにコピーする。
全ての出力および、入出力パラメータのオブジェクトについて変換が成功した場合は、変換したパラメータ構造体と、プロシージャの実行状態を識別する情報として、プロシージャの実行が完了したことを意味する値「0」を含む実行応答電文を作成する。実行応答電文は、ネットワークを介して、クライアント1に送信する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
また、オブジェクトの変換に失敗した場合は、プロシージャの実行状態を識別する情報として、プロシージャ実行後のパラメータ構造体の変換に失敗したことを意味する値「4」を含む実行応答電文を作成する。実行応答電文は、ネットワークを介して、クライアント1に送信する。その後、要求電文解析手段221を使用して、次の実行要求電文を待ち合わせに戻る。
本実施形態の効果は、クライアント1にデータベースアクセス手段を実装することなく、データベースサーバ3のストアドプロシージャ23を実行できることである。サーバ2に閉じたプロシージャの実行だけではなく、データベースへのアクセスを業務プログラム13に提供できる。その理由は、サーバ2が代理で、データベースアクセス手段23を使用して、データベースサーバ3にアクセスする構成だからである。
以上本発明を幾つかの実施形態を挙げて説明したが、本発明は以上の実施形態にのみ限定されず、その他各種の付加変更が可能である。また、本発明で必要な機能はコンピュータとプログラムとで実現することができる。プログラムは、磁気ディスクや半導体メモリ等のコンピュータ可読記録媒体に記録されて提供され、コンピュータの立ち上げ時などにコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータを前述した各実施の形態におけるクライアントスタブ、サーバスタブ、データベースアクセス手段等として機能させる。