IDLファイルのコンパイル
IDLファイルをコンパイルすることにより、クライアント、サーバそれぞれのアプリケーションの言語に合わせたスタブファイルとスケルトンファイルが作成されます。IDLファイルのコンパイルには、tdcコマンドを使用します。tdcコマンドを使用した例を以下に示します。
>tdc tdsample1.idl |
%OD_HOME=/opt/FSUNod |
スケルトンとサーバアプリケーションのソースとのコンパイル・リンク
サーバアプリケーションのソースとスケルトンのコンパイル方法、およびリンク方法について説明します。
COBOLでアプリケーションを作成した場合について、コンパイルとリンクの手順の流れを以下に示します。
サーバアプリケーションは、APMと動的に結合します。このため、サーバアプリケーションは共用ライブラリとし、動的結合ができる状態にしておく必要があります。この共用ライブラリには、サーバアプリケーションが使用するライブラリを結合してください。データベース管理システムのライブラリ以外で、サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 | 格納場所 | 用途 |
---|---|---|
f3fmalcapi.lib | Interstageインストールフォルダ\td\lib | コンポーネントトランザクションサービスランタイム(必須) |
libextpapiskl.lib | Interstageインストールフォルダ\extp\lib | コンポーネントトランザクションサービスランタイム(必須) |
odcobcbl.lib | Interstageインストールフォルダ\odwin\lib | CORBAサービスランタイム(注) |
(注) 中継用サーバアプリケーションを作成するときに必要です。
サーバアプリケーションとスケルトンをPowerCOBOL97でコンパイル後、リンクする場合のオプションの例を以下に示します。
PowerCOBOL97でコンパイルする場合は、以下の表に示すコンパイルオプションを設定してください。
項目 | 設定値 |
---|---|
登録集名 | CORBA="Interstageインストールフォルダ\odwin\include\cobol" |
SSOUT | 任意の文字列(注) |
(注) サーバアプリケーションでDISPLAY文を使用している場合に必要です。また、ワークユニット定義の環境変数ステートメントに、“任意の文字列”を環境変数として、DISPLAY文を出力するファイル名を指定します。指定されたファイルは、ワークユニット定義のカレントフォルダステートメントで指定されたフォルダ配下の“ワークユニット名\プロセスID”フォルダ配下に出力されます。以下に設定方法を示します。
Environment Variable: 任意の文字列=ファイル名
注意
スレッドライブラリ(libthread.so)は、スレッドモードで作成する場合にのみ必要です。
サーバアプリケーションは、APMと動的に結合します。このため、サーバアプリケーションは共用ライブラリとし、動的結合ができる状態にしておく必要があります。この共用ライブラリには、サーバアプリケーションが使用するライブラリを結合してください。データベース管理システムのライブラリ以外で、サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
スレッドモードのアプリケーションのコンパイルとリンク
ライブラリ名 | 格納場所 | 用途 |
---|---|---|
libthread.so | /usr/lib | スレッドライブラリ(必須) (注1) |
libtdalcapi.so | コンポーネントトランザクションサービスのインストールディレクトリ/lib | コンポーネントトランザクションサービス ランタイム(必須) |
libextpapiskl.so | EXTPのインストールディレクトリ/lib | コンポーネントトランザクションサービス ランタイム(必須) |
librcobol.so | COBOLのインストールディレクトリ/lib | COBOL ランタイム(必須) |
libOMcbl.so | CORBAサービスのインストールディレクトリ/lib | CORBAサービスランタイム(注2) |
(注1)
スレッドライブラリは必ず結合するライブラリの中で先頭に指定してください。
(注2)
中継用サーバアプリケーションを作成するとき、および、例外を使用するときに必要です。ただし、Sun日本語COBOLでアプリケーションを作成する場合と、PowerCOBOL97でアプリケーションを作成する場合で、リンクするライブラリが異なります。
Sun日本語COBOLでサーバアプリケーションを作成する場合には、libOMcbl.soをリンクしてください
PowerCOBOL97でサーバアプリケーションを作成する場合には、libOMcblMT.soをリンクしてください
リンクは、表の上から順番に行う必要があります。必要なものだけをリンクしてください。
なお、リンカにより結合処理を行う場合、以下のオプションを指定してください。
-dy -G |
サーバアプリケーションとスケルトンをコンパイル後、リンクする手順について例を以下に示します。
\:継続行を示します。
Sun 日本語COBOLの場合
%CORBA=/opt/FSUNod/include/COBOL %export CORBA %cobol -c tdsample1_s.cbl %cobol -c TD_TDSAMPLE1_INTF_skel.cbl %cobol -G -dy -o libtdsample1.so -lthread -L/opt/FSUNtd/lib \ -ltdalcapi -L/opt/FSUNextp/lib -lextpapiskl -L/opt/FJSVCOPop/lib -lrcobol \ tdsample1_s.o TD_TDSAMPLE1_INTF_skel.o |
PowerCOBOL97の場合
%CORBA=/opt/FSUNod/include/COBOL %export CORBA %cobol -c tdsample1_s.cbl %cobol -c TD_TDSAMPLE1_INTF_skel.cbl %cobol -G -dy -Tm -o libtdsample1.so -lthread -L/opt/FSUNtd/lib -ltdalcapi \ -L/opt/FSUNextp/lib -lextpapiskl tdsample1_s.o \ TD_TDSAMPLE1_INTF_skel.o |
PowerCOBOL97でアプリケーションを作成する場合には、以下の注意が必要です。
・リンクオプションに-Tmオプションを指定してください。また、ソースのコンパイルとリンクは分けて実施し、リンク時のオプションにのみ-Tmオプションを指定してください。
・リンクオプションに-Tmオプションを指定することで、自動的にlibrcobol.soをリンクします。このため、リンクライブラリにlibrcobol.soを指定する必要はありません。
プロセスモードのアプリケーションのコンパイルとリンク
サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 | 格納場所 | 用途 |
---|---|---|
libtdalcapi_nt.so | TDのインストールディレクトリ/lib | TD ランタイム(必須) |
libextpapiskl_nt.so | EXTPのインストールディレクトリ/lib | TD ランタイム(必須) |
libcobol.so | COBOLのインストールディレクトリ/lib | COBOL ランタイム(必須) |
libOMcbl.so | ODのインストールディレクトリ/lib | ODランタイム(注) |
(注)
中継用サーバアプリケーションを作成するとき、および、例外を使用するときに必要です。
リンクは、表の上から順番に行う必要があります。必要なものだけをリンクしてください。
なお、リンカにより結合処理を行う場合、以下のオプションを指定してください。
-dy -G |
サーバアプリケーションとスケルトンをコンパイル後、リンクする手順について例を以下に示します。
\:継続行を示します。
Sun 日本語COBOLの場合
%cobol -c TD_TDSAMPLE1_INTF_skel.cbl %cobol -G -o libtdsample1.so -L/opt/FSUNtd/lib -ltdalcapi_nt -L/opt/FSUNextp/lib -lextpapiskl_nt -L/opt/FJSVCOBop/lib -lcobol tdsample1_s.o \ TD_TDSAMPLE1_INTF_skel.o |
PowerCOBOL97の場合
%cobol -c TD_TDSAMPLE1_INTF_skel.cbl %cobol -G -o libtdsample1.so -L/opt/FSUNtd/lib -ltdalcapi_nt \ -L/opt/FSUNextp/lib -lextpapiskl_nt tdsample1_s.o \ TD_TDSAMPLE1_INTF_skel.o |
作成したアプリケーションライブラリにスレッドライブラリが結合されていないことを確認してください。
アプリケーションのコンパイル/リンクの手順に誤りがあった場合や、libthread.soがリンクされている場合、ワークユニット起動/停止処理またはクライアントとの通信が無応答状態となる可能性があります。その場合、以下の対処を行ってください。
1. 当該ワークユニット配下で動作しているアプリケーションプロセスのプロセスIDを特定します。
% ps -ef | grep ワークユニット名 |
2. 当該ワークユニット配下で動作しているアプリケーションプロセスの強制停止
% kill -9 プロセスID |
あるインタフェースで定義したオペレーションを、別のインタフェースに引き継ぐことを可能にするための機能です。継承を利用した場合、クライアントからは継承を意識せずに、継承したオペレーションを呼び出すことができます。
メソッドの呼び出しイメージについて以下に示します。
継承は、IDL定義ファイルに継承の指定を記述することによって使用することができます。継承先インタフェースは、継承元インタフェースのスコープ名をコロン(":")に続いて指定します。継承の指定例を以下に示します。
この例では、インタフェース“A”が継承元インタフェース、インタフェース“B”が継承先インタフェースとなります。
interface A { long op1(in long a); }; interface B:M::A { long op2(in long b); }; |
M:module名 A、B:interface名
継承先のidl定義内に継承元のidl定義をincludeする記述が必要です。include方法の例を以下に示します。
継承を使用する場合、モジュール作成時に継承元のインタフェースを実装しているライブラリをリンクします。継承を使用したアプリケーションの作成時に必要な注意点を、以下に示します。
継承元のインタフェースの状態
継承先のidl定義をidlコンパイルする場合、継承元は以下の状態であることが考えられます。ここでは、以下の状態の注意点を説明します。
継承元のインタフェースがインタフェースリポジトリに登録されていない場合
継承元のインタフェースがインタフェースリポジトリに登録されている場合
tdcコマンド実行時に -I オプションを指定してください。tdcコマンドの詳細については、“リファレンスマニュアル(コマンド編)”を参照してください。
継承先のidl定義に継承元のidl定義をincludeする記述を追加します。tdcコマンドは、-Iオプションと共に、-updateオプションを設定して実行してください。tdcコマンドの詳細については、“リファレンスマニュアル(コマンド編)”を参照してください。
継承元のライブラリの所在
継承先のサーバアプリケーションをコンパイルする場合の注意点を説明します。
継承元インタフェースが実装されているライブラリのリンク
継承元インタフェースが実装されているライブラリのパスの設定
継承を使用する場合のサーバアプリケーション作成方法
(1) 継承先のidl定義ファイル(Y.idl)をtdcコマンドでコンパイルします。
(2) 継承元となるAの実装部は、スケルトンと別ライブラリとして作成します。
(3) 継承先となるBの実装部をコンパイルし、ライブラリを作成します。
(4) (1)で生成されたスケルトンをコンパイルします。
(5) (2)(3)(4)で生成されたライブラリをリンクします。
ライブラリ
ダイナミックリンクライブラリ(.lib)
モジュール
ダイナミックリンクライブラリ(.dll)
ライブラリ
ダイナミックリンクライブラリ(.so)
モジュール
ダイナミックリンクライブラリ(.so)
継承元インタフェースが実装されているライブラリのパスの設定は、ワークユニット定義で設定します。
"path for Application"ステートメントに、継承元インタフェースへのパスを記述します。
"Library for Application"ステートメントに、継承元インタフェースへのパスを記述します。
アプリケーションの登録
サーバアプリケーションを他のアプリケーションからアクセス可能にするためには、目的のアプリケーションを識別するためのオブジェクトリファレンスを作成する必要があります。また、同時に作成したオブジェクトリファレンスをネーミングサービスに登録することによって、他のアプリケーションからのアクセスが可能になります。
トランザクションアプリケーションの場合、オブジェクトリファレンスの作成とネーミングサービスへの登録は、次の2つの方法で行うことができます。
ワークユニット起動による自動登録
OD_or_admコマンド(注)による手動登録
ワークユニット起動による自動登録の場合は、ワークユニットを起動するとワークユニットで指定された各アプリケーションごとにオブジェクトリファレンスが作成され、ネーミングサービスに登録されます。この場合、ワークユニットを停止すると、オブジェクトリファレンスは、自動的にネーミングサービスから削除され、無効となります。
OD_or_admコマンドによる手動登録の場合は、ワークユニットの起動前に、事前にOD_or_admコマンドによりオブジェクトリファレンスの作成とネーミングサービスへの登録を行います。この場合は、ワークユニットの起動、停止にかかわらず、オブジェクトリファレンスは有効です。
2つの方法とも、ネーミングサービスには以下の名前でオブジェクトリファレンスを登録します。
モジュール名::インタフェース名 |
また、インタフェースリポジトリIDとしては、以下のIDを使用します。
ワークユニット種別 : FUJITSU-Interstage-TDLC |
なお、ワークユニット種別は、ワークユニット定義で指定する必要があります。詳細は“OLTPサーバ運用ガイド”を参照してください。