Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編) |
目次 索引 |
第8章 サーバアプリケーションの開発(トランザクションアプリケーション/C言語) |
IDLファイルをコンパイルすることにより、クライアント、サーバそれぞれのアプリケーションの言語に合わせたスタブファイルとスケルトンファイルが作成されます。IDLファイルのコンパイルには、tdcコマンドを使用します。tdcコマンドのオプションは、使用する言語により異なります。tdcコマンドの詳細については、“リファレンスマニュアル(コマンド編)”を参照してください。tdcコマンドを使用した例を以下に示します。
> tdc -c -mc tdsample1.idl |
%OD_HOME=/opt/FSUNod |
%OD_HOME=/opt/FJSVod |
サーバアプリケーションのソースとスケルトンのコンパイル方法、およびリンク方法について説明します。
C言語でアプリケーションを作成した場合について、コンパイルとリンクの手順の流れを以下に示します。
サーバアプリケーションは、APMと動的に結合します。このため、サーバアプリケーションは共用ライブラリとし、動的結合ができる状態にしておく必要があります。この共用ライブラリには、サーバアプリケーションが使用するライブラリを結合してください。データベース管理システムのライブラリ以外で、サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 |
格納場所 |
用途 |
---|---|---|
f3fmalcapi.lib |
INTERSTAGEインストールフォルダ\td\lib |
コンポーネントトランザクションサービスランタイム(必須) |
libextpapiskl.lib |
INTERSTAGEインストールフォルダ\extp\lib |
コンポーネントトランザクションサービスランタイム(必須) |
odsv.lib |
INTERSTAGEインストールフォルダ\odwin\lib |
CORBAサービスランタイム(必須) |
odcnsv.lib |
INTERSTAGEインストールフォルダ\odwin\lib |
CORBAサービスランタイム(注) |
odifsv.lib |
INTERSTAGEインストールフォルダ\odwin\lib |
CORBAサービスランタイム(注) |
(注) 中継用サーバアプリケーションを作成する時に必要です。
サーバアプリケーションとスケルトンをコンパイル後、リンクする場合のオプションの例を以下に示します。
以下の表に示すオプションを設定してください。
Microsoft(R) Visual C++(R) .NET Standard/Microsoft(R) Visual C++(R) .NET Standard 2003/ Microsoft(R) Visual Studio 2005 の場合は、[プロジェクト]-[プロパティ]-[構成プロパティ]-[C/C++]で設定画面を表示することができます。
カテゴリー |
項目 |
設定値 |
---|---|---|
コード生成 |
構造体メンバのアライメント |
4バイト |
使用するランタイム |
マルチスレッド(DLL) |
|
プリプロセッサ |
プリプロセッサの定義 |
"OM_PC","OM_WIN32_BUILD", "__STDC__" を追加 |
また、コンパイル時に利用するインクルードファイルおよびライブラリファイルの格納ディレクトリを登録してください。
Microsoft(R) Visual C++(R) .NET Standard/Microsoft(R) Visual C++(R) .NET Standard 2003の場合は、[ツール]-[オプション]-[Projects]-[VC++ ディレクトリ]の「インクルード ファイル」、「ライブラリ ファイル」で設定画面を表示することができます。
Microsoft(R) Visual Studio 2005の場合は、[ツール]-[オプション]-[プロジェクトおよびソリューション]- [VC++ ディレクトリ]の「インクルード ファイル」、「ライブラリ ファイル」で設定画面を表示することができます。
登録例)
(InterstageをC:\INTERSTAGEにインストールした場合)
− インクルードファイル C:\INTERSTAGE\odwin\include C:\INTERSTAGE\td\include C:\INTERSTAGE\extp\include C:\INTERSTAGE\ots\include
− ライブラリファイル C:\INTERSTAGE\odwin\lib C:\INTERSTAGE\td\lib C:\INTERSTAGE\ots\lib
注意
スレッドライブラリ(libthread.so)は、スレッドモードで作成する場合にのみ必要です。
サーバアプリケーションは、APMと動的に結合します。このため、サーバアプリケーションは共用ライブラリとし、動的結合ができる状態にしておく必要があります。この共用ライブラリには、サーバアプリケーションが使用するライブラリを結合してください。データベース管理システムのライブラリ以外で、サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 |
格納場所 |
用途 |
---|---|---|
libthread.so |
/usr/lib |
スレッドライブラリ(必須) (注1) |
libtdalcapi.so |
コンポーネントトランザクションサービスのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libextpapiskl.so |
EXTPのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libsocket.so |
/usr/lib |
ソケットライブラリ(注2) |
libnsl.so |
/usr/lib |
nslライブラリ(注2) |
libOM.so |
CORBAサービスのインストールディレクトリ/lib |
CORBAサービスランタイム |
libOMcn.so |
CORBAサービスのインストールディレクトリ/lib |
CORBAサービスランタイム(注2) |
(注1):
スレッドライブラリは必ず結合するライブラリの中で先頭に指定してください。
(注2):
中継用サーバアプリケーションを作成する時に必要です。
リンクは、表の上から順番に行う必要があります。必要なものだけをリンクしてください。
なお、リンカにより結合処理を行う場合、以下のオプションを指定してください。
-dy -G |
サーバアプリケーションとスケルトンをコンパイル後、リンクする手順について例を以下に示します。
\:継続行を示します。
%cc -c -D_REENTRANT -I/opt/FSUNod/include -I/opt/FSUNtd/include tdsample1_s.c %cc -c -D_REENTRANT -l/opt/FSUNod/include -l/opt/FSUNtd/include \ TD_TDSAMPLE1_INTF_skel.c %cc -G -o libsample1.so tdsample1_s.o TD_TDSAMPLE1_INTF_skel.o -lthread \ -L/opt/FSUNtd/lib -ltdalcapi -L/opt/FSUNextp/lib -lextpapiskl % |
アプリケーションをプロセスモードで動作させる場合は、以下のオプションは指定しないでください。
-mt -D_REENTRANT |
サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 |
格納場所 |
用途 |
---|---|---|
libtdalcapi_nt.so |
コンポーネントトランザクションサービスのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libextpapiskl_nt.so |
EXTPのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libOM.so |
CORBAサービスのインストールディレクトリ/lib/nt |
CORBAサービスランタイム(注) |
libsocket.so |
/usr/lib |
ソケットライブラリ(注) |
libnsl.so |
/usr/lib |
TLIライブラリ(注) |
(注)
中継用サーバアプリケーションを作成する時に必要です。
リンクは、表の上から順番に行う必要があります。必要なものだけをリンクしてください。
なお、リンカにより結合処理を行う場合、以下のオプションを指定してください。
-dy -G |
サーバアプリケーションとスケルトンをコンパイル後、リンクする手順について例を以下に示します。
\:継続行を示します。
%cc -c -I/opt/FSUNod/include -I/opt/FSUNtd/include tdsample1_s.c %cc -c -I/opt/FSUNod/include -I/opt/FSUNtd/include TD_TDSAMPLE1_INTF_skel.c %cc -G -o libtdsample1_nt.so tdsample1_s.o TD_TDSAMPLE1_INTF_skel.o \ -L/opt/FSUNtd/lib -ltdalcapi_nt -L/opt/FSUNextp/lib -lextpapiskl_nt % |
作成したアプリケーションライブラリにスレッドライブラリが結合されていないことを確認してください。
アプリケーションのコンパイルならびにリンクの手順に誤りがあった場合や、libthread.soがリンクされている場合、ワークユニット起動/停止処理またはクライアントとの通信が無応答状態となる可能性があります。その場合、以下の対処を行ってください。
1. 当該ワークユニット配下で動作しているアプリケーションプロセスのプロセスIDを特定します。
% ps -ef | grep ワークユニット名 |
2. 当該ワークユニット配下で動作しているアプリケーションプロセスの強制停止
% kill -9 プロセスID |
注意
スレッドライブラリ(libpthread.so)は、スレッドモードで作成する場合にのみ必要です。
サーバアプリケーションは、APMと動的に結合します。このため、サーバアプリケーションは共用ライブラリとし、動的結合ができる状態にしておく必要があります。この共用ライブラリには、サーバアプリケーションが使用するライブラリを結合してください。データベース管理システムのライブラリ以外で、サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 |
格納場所 |
用途 |
---|---|---|
libpthread.so |
/usr/lib |
スレッドライブラリ(必須) (注1) |
libtdalcapi.so |
コンポーネントトランザクションサービスのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libextpapiskl.so |
EXTPのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libnsl.so |
/usr/lib |
nslライブラリ(注2) |
libOM.so |
CORBAサービスのインストールディレクトリ/lib |
CORBAサービスランタイム |
libOMcn.so |
CORBAサービスのインストールディレクトリ/lib |
CORBAサービスランタイム(注2) |
(注1):
スレッドライブラリは必ず結合するライブラリの中で先頭に指定してください。
(注2):
中継用サーバアプリケーションを作成する時に必要です。
リンクは、表の上から順番に行う必要があります。必要なものだけをリンクしてください。
なお、リンカにより結合処理を行う場合、以下のオプションを指定してください。
-shared -fpic または |
サーバアプリケーションとスケルトンをコンパイル後、リンクする手順について例を以下に示します。
\:継続行を示します。
%gcc -c -D_REENTRANT -I/opt/FJSVod/include -I/opt/FJSVtd/include tdsample1_s.c %gcc -c -D_REENTRANT -l/opt/FJSVod/include -l/opt/FJSVtd/include \ TD_TDSAMPLE1_INTF_skel.c %gcc -shared -fpic -o libsample1.so tdsample1_s.o TD_TDSAMPLE1_INTF_skel.o -lpthread \ -L/opt/FJSVtd/lib -ltdalcapi -L/opt/FJSVextp/lib -lextpapiskl % |
アプリケーションをプロセスモードで動作させる場合は、以下のオプションは指定しないでください。
-D_REENTRANT |
サーバアプリケーションのリンク時に指定するライブラリを以下に示します。
ライブラリ名 |
格納場所 |
用途 |
---|---|---|
libtdalcapi_nt.so |
コンポーネントトランザクションサービスのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libextpapiskl_nt.so |
EXTPのインストールディレクトリ/lib |
コンポーネントトランザクションサービスランタイム(必須) |
libOM.so |
CORBAサービスのインストールディレクトリ/lib/nt |
CORBAサービスランタイム(注) |
libnsl.so |
/usr/lib |
TLIライブラリ(注) |
(注)
中継用サーバアプリケーションを作成する時に必要です。
リンクは、表の上から順番に行う必要があります。必要なものだけをリンクしてください。
なお、リンカにより結合処理を行う場合、以下のオプションを指定してください。
-shared -fpic または |
サーバアプリケーションとスケルトンをコンパイル後、リンクする手順について例を以下に示します。
\:継続行を示します。
%gcc -c -I/opt/FJSVod/include -I/opt/FJSVtd/include tdsample1_s.c %gcc -c -I/opt/FJSVod/include -I/opt/FJSVtd/include TD_TDSAMPLE1_INTF_skel.c %gcc -shared -fpic -o libtdsample1_nt.so tdsample1_s.o TD_TDSAMPLE1_INTF_skel.o \ -L/opt/FJSVtd/lib -ltdalcapi_nt -L/opt/FJSVextp/lib -lextpapiskl_nt % |
作成したアプリケーションライブラリにスレッドライブラリが結合されていないことを確認してください。
アプリケーションのコンパイルならびにリンクの手順に誤りがあった場合や、libpthread.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)で生成されたライブラリをリンクします。
継承元インタフェースが実装されているライブラリのパスの設定は、ワークユニット定義で設定します。
"Path for Application" ステートメントに、継承元インタフェースへのパスを記述します。
"Library for Application" ステートメントに、継承元インタフェースへのパスを記述します。
サーバアプリケーションを他のアプリケーションからアクセス可能にするためには、目的のアプリケーションを識別するためのオブジェクトリファレンスを作成する必要があります。また、同時に作成したオブジェクトリファレンスをネーミングサービスに登録することによって、他のアプリケーションからのアクセスが可能になります。
トランザクションアプリケーションの場合、オブジェクトリファレンスの作成とネーミングサービスへの登録は、次の2つの方法で行うことができます。
ワークユニット起動による自動登録の場合は、ワークユニットを起動するとワークユニットで指定された各アプリケーションごとにオブジェクトリファレンスが作成され、ネーミングサービスに登録されます。この場合、ワークユニットを停止すると、オブジェクトリファレンスは、自動的にネーミングサービスから削除され、無効となります。
OD_or_admコマンドによる手動登録の場合は、ワークユニットの起動前に、事前にOD_or_admコマンドによりオブジェクトリファレンスの作成とネーミングサービスへの登録を行います。この場合は、ワークユニットの起動、停止にかかわらず、オブジェクトリファレンスは有効です。
2つの方法とも、ネーミングサービスには以下の名前でオブジェクトリファレンスを登録します。
モジュール名::インタフェース名 |
また、インタフェースリポジトリIDとしては、以下のIDを使用します。
ワークユニット種別がORBの場合 : FUJITSU-Interstage-TDLC |
ワークユニット種別がORBの場合 : FUJITSU-Interstage-TDLC |
なお、2つの方法のどちらを使用するかは、ワークユニット定義で指定する必要があります。詳細は“OLTPサーバ運用ガイド”を参照してください。
目次 索引 |