|
|
|
|
|
メッセージの優先順位の設定および取得
tpsprio(3c) と tpgprio(3c) の 2 つの ATMI 関数を使用して、メッセージ要求の優先順位を決定したり設定できます。この優先順位に従って、サーバがキューから要求を取り出します。つまり、最も優先順位の高い要求が最初に取り出されます。
この節では、次の内容について説明します。
メッセージの優先順位の設定
tpsprio(3c) 関数を使用すると、メッセージ要求の優先順位を設定できます。
tpsprio() ルーチンで優先順位を設定できるのは、1 つの要求だけです。つまり、tpcall() または tpacall() によって次に送信される要求、またはサービス・サブルーチンによって次に転送される要求だけです。
tpsprio() 関数の呼び出しには、次の文法を使用します。
int
tpsprio(int prio, long flags);
次の表は、tpsprio() 関数の引数を示しています。
tpsprio( ) 関数の引数
以下のコード例は、TRANSFER サービスから引用したものです。このコードでは、TRANSFER サービスはクライアントとして動作し、tpcall() を使用して WITHDRAWAL サービスに同期要求を送信しています。TRANSFER は tpsprio() を呼び出して WITHDRAWAL に対する要求メッセージの優先順位を上げます。また、TRANSFER のキューを待機した後で、WITHDRAWAL サービス (その後 DEPOSIT サービス) に対する要求がキューに格納されないようにします。 要求メッセージの優先順位の設定 メッセージの優先順位の取得 tpgprio(3c) を使用すると、メッセージ要求の優先順位を取得できます。 tpgprio() 関数の呼び出しには、次の文法を使用します。 要求元は、tpcall() または tpacall() 関数を呼び出した後に tpgprio() 関数を呼び出して、要求メッセージの優先順位を取得できます。要求元が関数を呼び出したが要求が送信されていない場合、関数は失敗して -1 が返され、tperrno(5) に TPENOENT が設定されます。tpgprio() の処理が成功すると、1 〜 100 の範囲内の整数値が返されます。100 が最も高い優先順位です。 tpsprio() 関数を使用して優先順位が明示的に設定されていない場合、メッセージの優先順として、要求を処理するサービス・ルーチンの優先順位が設定されます。アプリケーション内では、要求を処理するサービスの優先順位にデフォルト値の 50 が設定されます。ただし、システム管理者が別の値を指定している場合は除きます。 次のコード例は、非同期呼び出しによって送信されたメッセージの優先順位を確認する方法を示しています。 送信後の要求の優先順位の確認/* 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);
}int
tpgprio();#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
}
. . .
}
|
|
|
|
|
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|