|
|
|
|
|
非同期メッセージの送信
この節では、次の操作を行う方法について説明します。
ここで説明する非同期の処理は、ファンアウト並列処理と呼ばれます。クライアントの要求が複数のサービスに同時に分散 (つまり「ファンアウト」) されて処理が行われるからです。
このほかに、BEA Tuxedo システムでは、非同期処理としてパイプライン並列処理もサポートされています。この処理では、tpforward() 関数を使用して 1 つのサービスから別のサービスに処理が渡されます (転送されます)。tpforward() 関数については、「サーバのコーディング」を参照してください。
非同期要求の送信
tpacall(3c) 関数は、サービス要求を送信し、直ちに制御を戻します。tpacall() 関数の呼び出しには、次の文法を使用します。
int
tpacall(char *svc, char *data, long len, long flags)
次の表は、tpacall() 関数の引数を示しています。
tpacall( ) 関数の引数
tpacall() 関数は、svc パラメータに指定されたサービスに要求メッセージを送信し、直ちに制御を戻します。呼び出しが正常に終了すると、tpacall() 関数は整数値を返します。この値は、関連する要求に対する正しい応答にアクセスするための記述子として使用されます。tpacall() がトランザクション・モードで実行されている場合 (「グローバル・トランザクションのコーディング」を参照)、トランザクションのコミット時に未処理の応答が存在することはありません。つまり、あるトランザクションの範囲内では、要求ごとにその応答が返されるので、最終的には対応する応答を必ず受信することになります。 flags 引数に TPNOREPLY が設定されると、応答が必要ないことが tpacall() に通知されます。このフラグが設定されている場合、tpacall() の処理が正常に終了すると、応答記述子として 0 が返されます。以降の処理で、この値が tpgetrply() 関数に渡されると、この値は無効になります。プロセスがトランザクション・モードのときにこのフラグを正しく使用するためのガイドラインについては、「グローバル・トランザクションのコーディング」を参照してください。 エラーが発生した場合、tpacall() は -1 を返し、tperrno(5)発生したエラー条件が返されます。tpacall() が返すエラー・コードの多くは、tpcall() が返すエラー・コードと同じです。この 2 つの関数のエラー・コードは、一方が同期呼び出し、もう一方が非同期呼び出しに基づいているという点が異なります。これらのエラーについては、「エラーの管理」を参照してください 例: TPNOTRAN と TPNOREPLY フラグを設定した非同期メッセージの送信 以下のコード例は、tpacall() で TPNOTRAN と TPNOREPLY フラグを使用する方法を示しています。このコードは、「例:TPNOTRAN フラグを設定した同期メッセージの送信」のコードと同じです。ただし、ここで示すコードでは、PRINTER サービスからの応答は要求されていません。TPNOREPLY フラグはクライアントが応答を要求していないこと、TPNOTRAN フラグは PRINTER サービスが現在のトランザクションに参加しないことを示します。詳細については、「エラーの管理」を参照してください。 TPNOTRAN と TPNOREPLY フラグを設定した非同期メッセージの送信 例: 非同期要求の送信 以下のコード例は、銀行の総残高照会を行う非同期呼び出しを示しています。銀行業務アプリケーションのデータは、複数のデータベース・サイトに分散されているので、各サイトに対して SQL クエリを実行する必要があります。その場合、データベース・サイトごとに支店番号が 1 つ選択され、そのサイトに対して ABAL または TBAL サービスが呼び出されます。支店番号は実際の SQL クエリでは使用されませんが、この番号によって BEA Tuxedo システムが適切なサイトに要求を送ることができるようになります。次のコードでは、サイトごとに for ループが tpacall() を一度呼び出しています。 非同期要求の送信 非同期応答の受信 サービス呼び出しに対する応答は、tpgetrply(3c) 関数を呼び出すと非同期的に受信できます。tpgetrply() 関数は、tpacall() が以前に送信した要求に対する応答をキューから取り出します。 tpgetrply() 関数の呼び出しには、次の文法を使用します。 次の表は、tpgetrply() 関数の引数を示しています。 tpgetrply( ) 関数の引数
#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
アプリケーションを終了
}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);
}
}int
tpgetrply(int *cd, char **data, long *len, long flags)
デフォルトでは、この関数は、cd パラメータが参照する値に対応した応答を待ちます。応答を待っている間に、ブロッキング・タイムアウトが発生する場合があります。タイムアウトが発生するのは、tpgetrply() が失敗し、tperrno(5) に TPETIME が設定された場合です。ただし、flags パラメータに TPNOTIME が設定されている場合は除きます。
|
|
|
|
|
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|