ToolTalk メッセージには、メッセージ情報を格納して配信情報を ToolTalk サービスに提供する属性が含まれています。配信情報は、メッセージを適切な受信側へルーティングするために使用されます。
ToolTalk メッセージは、アドレス、サブジェクト (「操作」や「引数」など)、および配信情報 (「クラス」や「配信範囲」など) の属性を含む単純な構造体です。メッセージの属性を表 8-1 に示します。
表 8-1 ToolTalk メッセージの属性
メッセージの属性 |
値 |
機能 |
使用できる人 |
---|---|---|---|
引数 |
引数または結果 |
操作に使用する引数を指定する。メッセージが応答である場合、これらの引数は操作の結果を含む |
送信側と受信側 |
クラス |
|
受信側が操作を実行する必要があるかどうかを指定する |
送信側 |
ファイル |
char *pathname |
操作に関連するファイルを指定する。メッセージの配信範囲がファイルに関係しない場合、このメッセージ属性は無効である |
送信側と ToolTalk |
オブジェクト |
char *objid |
操作に関係するオブジェクトを指定する |
送信側と ToolTalk |
操作 |
char *opname |
実行する操作名を指定する |
送信側 |
otype |
char *otype |
操作に関係するオブジェクトの型を指定する |
送信側と ToolTalk |
アドレス |
|
メッセージを送信する場所を指定する |
送信側 |
ハンドラ |
char *procid |
受信側プロセスを指定する |
送信側と ToolTalk |
handler_ptype |
char *ptype |
受信側プロセスの型を指定する |
送信側と ToolTalk |
処置 |
|
実行中のプロセスがメッセージを受信できない場合に取るべき手段を指定する |
送信側と ToolTalk |
配信範囲 |
|
セッションまたはファイルに対して登録された内容に基づいて、受信する可能性のあるアプリケーションを指定する |
送信側と ToolTalk |
sender_ptype |
char *ptype |
送信側プロセスの型を指定する |
送信側と ToolTalk |
セッション |
char *sessid |
送信側プロセスのセッションを指定する |
送信側と ToolTalk |
状態 |
int status, char *status_str |
メッセージの状態に関する追加情報を指定する |
受信側と ToolTalk |
他のアプリケーションにアドレス指定されたメッセージは、特定のプロセス、またはメッセージに一致するパターンを登録してあるプロセスにアドレス指定できます。メッセージをプロセスにアドレス指定するときは、他のアプリケーションのプロセス ID (procid) を知っている必要があります。ただしプロセスは、通常は互いの procid を知りません。ほとんどの場合、送信側はどのプロセスが操作 (要求メッセージ) を実行するのか、またはどのプロセスがイベント (通知メッセージ) を認識するのかを知らなくてもかまいません。
通常、ToolTalk サービスを使用して通信するアプリケーションには共通点があります。アプリケーションが同じセッションで実行されていたり、同じファイルまたはデータを対象としていたりします。アプリケーションは、処理の対象を登録するために、ToolTalk サービスにセッションまたはファイル (あるいはその両方) を結合します。ファイル情報とセッション情報は、メッセージパターンが指定された ToolTalk サービスが、メッセージを受信するアプリケーションを判定するために使用します。
配信範囲属性機能を使用できるのは、NFS ファイルシステムと UFS ファイルシステムだけです。tmpfs ファイルシステムでは、ファイルへの配信範囲は指定できません。
メッセージをファイルに配信範囲指定した場合は、そのファイルを結合している (かつ残りの属性に一致している) アプリケーションだけがメッセージを受信します。1 つのファイルを処理の対象として共有するアプリケーションは、同じセッションで実行している必要はありません。
メッセージがファイル配信範囲であることをパターンに指定する際、使用できる型を表 8-2 に示します。
表 8-2 メッセージのファイル配信範囲をパターンに指定する際の型
配信範囲の型 |
説明 |
---|---|
|
指定したファイルだけを配信範囲とする。同時にセッション属性も設定すればセッション中のファイルと同様な配信範囲を指定できるが、配信範囲が |
|
処理の対象となるファイルとセッションの「論理和」を配信範囲とする。ファイル、セッション、またはその両方を配信範囲とするメッセージに一致するのは、この配信範囲を指定したパターンだけである |
|
処理の対象となるファイルとセッションの「論理積」を配信範囲とする。ファイルとセッションを同時に配信範囲とするメッセージにだけ一致するのは、この配信範囲を指定したパターンだけである |
TT_FILE_IN_SESSION
と TT_SESSION
の論理和を配信範囲に指定するには、例 8-1 のように両方の配信範囲を同じパターンに追加します。
TT_FILE_IN_SESSION
と TT_SESSION
の論理和を配信範囲に指定する場合
メッセージのファイル配信範囲の型も、パターンと同じです。この型を表 8-3 に示します。
表 8-3 メッセージ用の配信範囲
メッセージの配信範囲が TT_FILE
または TT_BOTH
の場合は、ToolTalk クライアントライブラリが、そのファイルを処理対象とするクライアントのセッションをデータベースサーバーからすべて探し出し、それらの
ToolTalk セッションにメッセージを送信します。ToolTalk セッションは、その後でメッセージとクライアントを照合します。メッセージの送信側は、tt_file_join を明示的に呼び出す必要はありません。
配信範囲が TT_FILE_IN_SESSION
または TT_SESSION
のメッセージにファイルを指定しても、ToolTalk
データベースサーバーには連絡されず、メッセージは指定したセッション配信範囲のクライアントにしか送信されません。
メッセージをセッションに配信範囲指定した場合は、そのセッションに接続しているアプリケーションだけが受信可能側であると見なされます。
Tt_message m= tt_message_create(); tt_message_scope_set(m, TT_SESSION); tt_message_file_set(m, file); |
最初の行でメッセージを作成しています。2 行目ではメッセージの配信範囲を追加し、3 行目ではメッセージの範囲に影響を与えないファイル属性を追加しています。
アプリケーションは、メッセージ配信範囲として TT_FILE_IN_SESSION を指定することによって、メッセージ配布の範囲をかなり限定できます。指定したファイルとセッションの両方を結合しているアプリケーションだけが受信可能側であると見なされます。
また、アプリケーションは、メッセージのセッションを処理対象として登録しているすべてのクライアントを、TT_SESSION と tt_message_file_set を指定することによって、メッセージの配信範囲とすることもできます。パターンが一致するクライアントがメッセージを受信した場合、その受信側クライアントは tt_message_file を呼び出すことによってファイル名を取得できます。
Tt_message m= tt_message_create(); tt_message_scope_set(m, TT_FILE_IN_SESSION); tt_message_file_set(m, file); |
最初の行でメッセージを作成しています。2 行目ではメッセージの配信範囲を追加し、3 行目ではメッセージ配信範囲にファイルを追加しています。
ToolTalk サービスではメッセージ引数のデータ型として、整数、NULL 終了文字列、バイト文字列の 3 種類をサポートしています。
ToolTalk メッセージで他のデータ型を送信する際、クライアントはデータをシリアル化して文字列またはバイト文字列に変換し、受信時はそのシリアル化を解除しなければなりません。今回の ToolTalk サービスとともに新しく提供する XDR 引数 API 呼び出しでは、これらの処理を関数として提供します。クライアントが用意するのは、XDR ルーチンとデータへのポインタだけです。ToolTalk サービスは、データをシリアル化して内部バッファに入れた後、そのデータをバイトストリームと同じように処理します。