|
|
サーバでマルチコンテキストとマルチスレッドを使用するためのコーディング
ここでは、次の内容について説明します。
注記 この節で示す手順とコード例は、BEA Tuxedo システムで提供される C 言語のライブラリ関数を参照します。詳細については、『BEA Tuxedo C 言語リファレンス』を参照してください。COBOL アプリケーションではマルチコンテキスト・サーバの生成に必要なマルチスレッドがサポートされていないので、C 言語の関数に相当する COBOL ルーチンは利用できません。
コンテキストの属性
コンテキストを使用する場合、コーディングで以下の事柄に注意してください。
マルチコンテキスト・サーバのコーディング規則
マルチコンテキスト・サーバ使用する場合、コーディングで以下の規則に注意してください。
この規則に違反すると、tpreturn() または tpforward() はユーザ・ログにメッセージを書き込み、呼び出し元に TPESVCERR を示して、メイン・サーバのディスパッチ・ループに制御を戻します。無効 tpreturn() が実行されたコンテキスト内のスレッドは、無効コンテキスト状態になります。
サーバおよびサーバ・スレッドの初期化と終了
サーバとサーバ・スレッドの初期化と終了には、BEA Tuxedo システムで提供されるデフォルトの関数や独自の関数を使用できます。
初期化と終了を行うデフォルトの関数
目的 |
使用するデフォルトの関数 |
---|---|
サーバの初期化 |
|
サーバ・スレッドの初期化 |
|
サーバの終了 |
|
サーバ・スレッドの終了 |
スレッドを生成するためのサーバのプログラミング マルチコンテキスト・サーバを使用するほとんどのアプリケーションでは、システム生成のディスパッチ・サーバ・スレッドだけが使用されます。ただし、アプリケーション・サーバに新しいスレッドを生成することもできます。この節では、その方法について説明します。 スレッドの生成 オペレーティング・システムのスレッド関数を使用して、アプリケーション・サーバに新しいスレッドを生成できます。これらの新しいスレッドは、BEA Tuxedo システムから独立して動作できます。また、いずれかのサーバ・ディスパッチ・スレッドと同じコンテキストで動作することもできます。 コンテキストへのスレッドの対応付け アプリケーション生成のサーバ・スレッドは、当初どのサーバ・ディスパッチ・コンテキストにも対応付けられていません。ただし、初期化される前に呼び出された場合、ほとんどの ATMI 関数は暗黙的に tpinit() を実行します。サーバで tpinit() を呼び出すことは禁止されているので、そのような呼び出しを行うと問題が発生します。サーバ・プロセスが tpinit() を呼び出すと、tpinit() は -1 を返して tperrno(5) に TPEPROTO を設定します。 そのため、アプリケーション生成のサーバ・スレッドは、既存のコンテキストと対応付けを行ってから ATMI 関数を呼び出す必要があります。アプリケーション生成のサーバ・スレッドを既存のコンテキストに対応付けるには、以下の手順をコーディングします。
この規則に違反すると、tpforward() または tpreturn() が失敗し、呼び出し元にサービス・エラーが示されます。
マルチコンテキスト・サーバでアプリケーション・スレッドを生成するためのコード例
次のコード例は、サービスが別のスレッドを生成してそのサービスの作業を行うマルチコンテキスト・サーバを示しています。このコードは、サーバでアプリケーション・スレッドを生成する必要があるアプリケーションで使用します。オペレーティング・システムのスレッド関数は、オペレーティング・システムによって異なります。このコード例では、POSIX 関数と ATMI 関数が使用されています。
注記 コードを簡単にするために、エラー・チェックは省略してあります。また、BEA Tuxed システムによってディスパッチされたスレッドだけを使用するマルチコンテキスト・サーバも省略してあります。そのようなサーバのコーディングは、スレッド・セーフのプログラミング方法が使用されている場合、シングルコンテキスト・サーバのコーディングとまったく同じです。
マルチコンテキスト・サーバでのスレッドの生成
#include <pthread.h>
#include <atmi.h>
void *withdrawalthread(void *);
struct sdata {
TPCONTEXT_T ctxt;
TPSVCINFO *svcinfoptr;
};
void
TRANSFER(TPSVCINFO *svcinfo)
{
struct sdata transferdata;
pthread_t withdrawalthreadid;
tpgetctxt(&transferdata.ctxt, 0);
transferdata.svcinfoptr = svcinfo;
pthread_create(&withdrawalthreadid, NULL, withdrawalthread, &transferdata);
tpcall("DEPOSIT", ...);
pthread_join(withdrawalthreadid, NULL);
tpreturn(TPSUCCESS, ...);
}
void *
withdrawalthread(void *arg)
{
tpsetctxt(arg->ctxt, 0);
tpopen();
tpcall("WITHDRAWAL", ...);
tpclose();
return(NULL);
}
このコードでは、元のディスパッチ・スレッドで DEPOSIT サービスを呼び出し、アプリケーション生成のスレッドで WITHDRAWAL を呼び出して、口座振り替えを行っています。この例では、リソース・マネージャで混在モデルがサポートされていることを前提としています。つまり、サーバのすべてのスレッドが特定のインスタンスと対応付けされていなくても、そのサーバの複数のスレッドが特定のデータベース接続と対応付けられます。ただし、そのようなモデルがサポートされたリソース・マネージャはほとんどありません。
アプリケーション生成のスレッドを使用しないようにすると、このコードはさらに簡単になります。このコード例で tpcall() を 2 回呼び出して行っている並列処理を実現するには、サーバ・ディスパッチ・スレッド内で tpacall() と tpgetrply() をそれぞれ 2 回呼び出します。
関連項目
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|