BEA Logo BEA Tuxedo Release 8.0

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

 

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

 


メッセージの優先順位の設定および取得

tpsprio(3c)tpgprio(3c) の 2 つの ATMI 関数を使用して、メッセージ要求の優先順位を決定したり設定できます。この優先順位に従って、サーバがキューから要求を取り出します。つまり、最も優先順位の高い要求が最初に取り出されます。

この節では、次の内容について説明します。

メッセージの優先順位の設定

tpsprio(3c) 関数を使用すると、メッセージ要求の優先順位を設定できます。

tpsprio() ルーチンで優先順位を設定できるのは、1 つの要求だけです。つまり、tpcall() または tpacall() によって次に送信される要求、またはサービス・サブルーチンによって次に転送される要求だけです。

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

int
tpsprio(int prio, long flags);

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

tpsprio( ) 関数の引数

引数

説明

prio

新しい優先順位を示す整数値。この引数の持つ意味は、flags パラメータによって異なります。flags にゼロが設定されている場合、prio は相対値を示し、値の符号は現在の優先順位を上げることまたは下げることを示します。ほかの値が設定されている場合、指定された値は絶対値を示し、prio には 0 〜 100 の範囲の値を設定する必要があります。この範囲外の値を指定すると、値が自動的に 50 に設定されます。

flags

prio の値を相対値 (0) または絶対値 (TPABSOLUTE) のどちらの値として処理するのかを示すフラグ。デフォルトは相対値です。

以下のコード例は、TRANSFER サービスから引用したものです。このコードでは、TRANSFER サービスはクライアントとして動作し、tpcall() を使用して WITHDRAWAL サービスに同期要求を送信しています。TRANSFERtpsprio() を呼び出して WITHDRAWAL に対する要求メッセージの優先順位を上げます。また、TRANSFER のキューを待機した後で、WITHDRAWAL サービス (その後 DEPOSIT サービス) に対する要求がキューに格納されないようにします。

要求メッセージの優先順位の設定

/* WITHDRAWAL サービス呼び出しの優先順位を上げます。 */
if (tpsprio(PRIORITY, 0L) == -1)
(void)userlog("Unable to increase priority of withdraw\n");

if (tpcall("WITHDRAWAL", (char *)reqfb,0, (char **)&reqfb, (long *)
\
&reqlen,TPSIGRSTRT) == -1) {
(void)Fchg(transf, STATLIN, 0, "Cannot withdraw from debit account", \
(FLDLEN)0);
tpfree((char *)reqfb);
tpreturn(TPFAIL, 0, transb->data, 0L, 0);
}

メッセージの優先順位の取得

tpgprio(3c) を使用すると、メッセージ要求の優先順位を取得できます。

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

int
tpgprio();

要求元は、tpcall() または tpacall() 関数を呼び出した後に tpgprio() 関数を呼び出して、要求メッセージの優先順位を取得できます。要求元が関数を呼び出したが要求が送信されていない場合、関数は失敗して -1 が返され、tperrno(5)TPENOENT が設定されます。tpgprio() の処理が成功すると、1 〜 100 の範囲内の整数値が返されます。100 が最も高い優先順位です。

tpsprio() 関数を使用して優先順位が明示的に設定されていない場合、メッセージの優先順として、要求を処理するサービス・ルーチンの優先順位が設定されます。アプリケーション内では、要求を処理するサービスの優先順位にデフォルト値の 50 が設定されます。ただし、システム管理者が別の値を指定している場合は除きます。

次のコード例は、非同期呼び出しによって送信されたメッセージの優先順位を確認する方法を示しています。

送信後の要求の優先順位の確認

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

main ()
{
int cd1, cd2; /* 呼び出し記述子 */
int pr1, pr2; /* 2 つの呼び出しに対する優先順位 */
char *buf1, *buf2; /* バッファ */
long buf1len, buf2len; /* バッファの長さ */

join application

if (buf1=tpalloc("FML", NULL, 0) == NULL)
error
if (buf2=tpalloc("FML", NULL, 0) == NULL)
error

populate FML buffers with send request

if ((cd1 = tpacall("service1", buf1, 0, 0)) == -1)
error
if ((pr1 = tpgprio()) == -1)
error
if ((cd2 = tpacall("service2", buf2, 0, 0)) == -1)
error
if ((pr2 = tpgprio()) == -1)\
error

if (pr1 >= pr2) { /* 呼び出しの優先順位に基づいて、tpgetreply の順序を設定します。 */
if (tpgetrply(&cd1, &buf1, &buf1len, 0) == -1)
error
if (tpgetrply(&cd2, &buf2, &buf2len, 0) == -1)
error
}
else {
if (tpgetrply(&cd2, &buf2, &buf2len, 0) == -1)
error
if (tpgetrply(&cd1, &buf1, &buf1len, 0) == -1)
error
}
. . .
}

 

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