BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   C 言語を使用した BEA Tuxedo アプリケーションのプログラミング   |   先頭へ   |   前へ   |   次へ   |   目次

 


非同期メッセージの送信

この節では、次の操作を行う方法について説明します。

ここで説明する非同期の処理は、ファンアウト並列処理と呼ばれます。クライアントの要求が複数のサービスに同時に分散 (つまり「ファンアウト」) されて処理が行われるからです。

このほかに、BEA Tuxedo システムでは、非同期処理としてパイプライン並列処理もサポートされています。この処理では、tpforward() 関数を使用して 1 つのサービスから別のサービスに処理が渡されます (転送されます)。tpforward() 関数については、「サーバのコーディング」を参照してください。

非同期要求の送信

tpacall(3c) 関数は、サービス要求を送信し、直ちに制御を戻します。tpacall() 関数の呼び出しには、次の文法を使用します。

int
tpacall(char *svc, char *data, long len, long flags)

次の表は、tpacall() 関数の引数を示しています。

tpacall( ) 関数の引数

引数

説明

svc

アプリケーションで提供されるサービス名を指すポインタ。

data

要求のデータ部分のアドレスを含むポインタ。このポインタは、tpalloc() の以前の呼び出しで割り当てられた型付きバッファを参照しなければなりません。idatatype (および指定されている場合は subtype) は、サービス・ルーチンで使用できる type (および指定されている場合は subtype) と合致する必要があります。タイプが合致しない場合、tperrnoTPEITYPE が設定され、関数の呼び出しが失敗します。

データが要求されていない場合、data に NULL ポインタを設定します。NULL ポインタが設定されていると、パラメータは無視されます。要求でデータが信されていない場合は、data のバッファを割り当てる必要はありません。

len

data で参照されるバッファ内の要求データの長さ。バッファが自己記述型の場合、つまり FMLFML32VIEWVIEW32X_COMMONX_C_TYPE、または STRING 型バッファの場合、この引数にゼロを設定すると引数が無視されます。

flags

フラグのオプション。論理演算子 OR を使用すると、複数のフラグをリストできます。この値にゼロを設定すると、デフォルトの方法で通信が行われます。有効なフラグとデフォルト値については、『BEA Tuxedo C リファレンス』の tpacall(3c) を参照してください。

tpacall() 関数は、svc パラメータに指定されたサービスに要求メッセージを送信し、直ちに制御を戻します。呼び出しが正常に終了すると、tpacall() 関数は整数値を返します。この値は、関連する要求に対する正しい応答にアクセスするための記述子として使用されます。tpacall() がトランザクション・モードで実行されている場合 (「グローバル・トランザクションのコーディング」を参照)、トランザクションのコミット時に未処理の応答が存在することはありません。つまり、あるトランザクションの範囲内では、要求ごとにその応答が返されるので、最終的には対応する応答を必ず受信することになります。

flags 引数に TPNOREPLY が設定されると、応答が必要ないことが tpacall() に通知されます。このフラグが設定されている場合、tpacall() の処理が正常に終了すると、応答記述子として 0 が返されます。以降の処理で、この値が tpgetrply() 関数に渡されると、この値は無効になります。プロセスがトランザクション・モードのときにこのフラグを正しく使用するためのガイドラインについては、「グローバル・トランザクションのコーディング」を参照してください。

エラーが発生した場合、tpacall()-1 を返し、tperrno(5)発生したエラー条件が返されます。tpacall() が返すエラー・コードの多くは、tpcall() が返すエラー・コードと同じです。この 2 つの関数のエラー・コードは、一方が同期呼び出し、もう一方が非同期呼び出しに基づいているという点が異なります。これらのエラーについては、「エラーの管理」を参照してください

例: TPNOTRAN と TPNOREPLY フラグを設定した非同期メッセージの送信

以下のコード例は、tpacall()TPNOTRANTPNOREPLY フラグを使用する方法を示しています。このコードは、「例:TPNOTRAN フラグを設定した同期メッセージの送信」のコードと同じです。ただし、ここで示すコードでは、PRINTER サービスからの応答は要求されていません。TPNOREPLY フラグはクライアントが応答を要求していないこと、TPNOTRAN フラグは PRINTER サービスが現在のトランザクションに参加しないことを示します。詳細については、「エラーの管理」を参照してください。

TPNOTRAN と TPNOREPLY フラグを設定した非同期メッセージの送信

#include <stdio.h>
#include "atmi.h"

main()

{
char *rbuf; /* レポート用バッファ */
long rlen, rrlen; /* レポート用の送信バッファと受信バッファの長さ */

join application

if (rbuf = tpalloc("STRING", NULL, 0) == NULL) /* レポート用の領域の割り当て */
error
(void)strcpy(rbuf, "REPORT=accrcv DBNAME=accounts");/* レポートのパラメータの送信 */
rlen = strlen(rbuf)+1; /* 要求の長さ */

start transaction

if (tpcall("REPORT", rbuf, rlen, &rbuf, &rrlen, 0)
== -1) /* レポート印刷ストリームの取得 */
error
if (tpacall("PRINTER", rbuf, rrlen, TPNOTRAN|TPNOREPLY)
== -1) /* プリンタへのレポートの送信 */
error

. . .
commit transaction
free buffer
アプリケーションを終了
}

例: 非同期要求の送信

以下のコード例は、銀行の総残高照会を行う非同期呼び出しを示しています。銀行業務アプリケーションのデータは、複数のデータベース・サイトに分散されているので、各サイトに対して SQL クエリを実行する必要があります。その場合、データベース・サイトごとに支店番号が 1 つ選択され、そのサイトに対して ABAL または TBAL サービスが呼び出されます。支店番号は実際の SQL クエリでは使用されませんが、この番号によって BEA Tuxedo システムが適切なサイトに要求を送ることができるようになります。次のコードでは、サイトごとに for ループが tpacall() を一度呼び出しています。

非同期要求の送信

audv->balance = 0.0;
(void)strcpy(audv->ermsg, "");

for (i=0; i<NSITE; i++) {

/* aud 構造体を用意します。 */

audv->b_id = sitelist[i];/* このフィールドでルーティングを行います。 */

/* tpacall の実行 */

if ((cd[i]=tpacall(sname, (char *)audv, sizeof(struct aud), 0))
== -1) {
(void)fprintf (stderr,
"%s:%s service request failed for site rep %ld\n",
pgmname, sname, sitelist[i]);
tpfree((char *)audv);
return(-1);
}
}

非同期応答の受信

サービス呼び出しに対する応答は、tpgetrply(3c) 関数を呼び出すと非同期的に受信できます。tpgetrply() 関数は、tpacall() が以前に送信した要求に対する応答をキューから取り出します。

tpgetrply() 関数の呼び出しには、次の文法を使用します。

int
tpgetrply(int *cd, char **data, long *len, long flags)

次の表は、tpgetrply() 関数の引数を示しています。

tpgetrply( ) 関数の引数

引数

説明

cd

tpacall() が返す呼び出し記述子を指すポインタ。

*data

応答を受信する出力バッファを指すポインタのアドレス。tpalloc() 関数を使用して、出力バッファを割り当てておく必要があります。tpcall() から正常に制御が戻ったときに、応答メッセージにデータが含まれていないと、*data にゼロが設定されます。ポインタと出力バッファの内容は変更されません。

要求メッセージと応答メッセージの両方に同じバッファを使用できます。その場合、odata には、入力バッファを割り当てたときに返されたポインタのアドレスを設定します。このパラメータが NULL を指している場合は、エラーになります。

len

応答データの長さを指すポインタ。このパラメータが NULL を指している場合は、エラーになります。

flags

フラグのオプション。論理演算子 OR を使用すると、複数のフラグをリストできます。この値にゼロを設定すると、デフォルトの方法で通信が行われます。有効なフラグとデフォルト値については、『BEA Tuxedo C リファレンス』の tpcall(3c) を参照してください。

デフォルトでは、この関数は、cd パラメータが参照する値に対応した応答を待ちます。応答を待っている間に、ブロッキング・タイムアウトが発生する場合があります。タイムアウトが発生するのは、tpgetrply() が失敗し、tperrno(5)TPETIME が設定された場合です。ただし、flags パラメータに TPNOTIME が設定されている場合は除きます。

 

先頭へ戻る 前のトピックへ 次のトピックへ