[Glue!] 変更通知メッセージ


送信要求の登録

エージェントは、その値が変化したら通知を受け取りたい名前について、 変更通知メッセージ送信要求を登録しておくことができる。

この登録では、名前毎に、通知の送り先のエージェント識別子、 通知モードと呼ぶ通知を送る契機、 通知文字列と呼ぶ変更通知の先頭部分を構成する文字列、 の三者を指定することができ、 一般に

AgentID/InformMode/InformText
の形式で表記する。 これらのうち、通知モードと通知文字列とは省略が可能で、 省略時には各々、 "ANY""Changed" が用いられる。

通知モードは以下に示す文字列によって示される。 ここに示す以外の文字列が指定された場合には、 サーバの動作は予測できない。
ここでは論理値としては、数値の零あるいは空文字列を偽と解釈し、 それ以外のどんな値も全て真と見なす。 また、未定義値は真とも偽とも見なさない。

"ANY"
名前の変化のどのようなものも、メッセージを送信する。
"ON"
名前の値が真以外(未定義状態を含む)から真へ変化した時に、メッセージを送信する。
"OFF"
名前の値が偽以外(未定義状態を含む)から偽へ変化した時に、メッセージを送信する。
"LOGICAL"
名前の値が真以外から真へあるいは偽以外から偽へ変化した時に、メッセージを送信する。
"BOUND"
名前が未定義状態から何らかの値を持った状態へ変化した時に、メッセージを送信する。
"UNBOUND"
名前が何らかの値を持った状態から未定義状態へ変化した時に、メッセージを送信する。
"BINDING"
名前の値が定義されているか否かの状態が変化した時に、メッセージを送信する。


変更通知メッセージの形式

サーバは、 ある名前の値が変化した場合、 あらかじめ送信要求を登録していたエージェントに対して 変更通知メッセージを送る。 このメッセージは、 要求時に指定した通知文字列あるいはデフォールトの文字列 "Changed" に、 一つの空白文字で区切って値の変化した名前を続けたものである。

値の変化のあった名前そのものに送信要求の登録が無ければ、 サーバはその名前のひとつ上位の構造に関する登録の有無を調べる。 この操作を最上位の名前まで繰り返すが、送られる通知の数は、一つの名前の値の変化につき、 一つの通知先と通知文字列との組合せ毎に高々一つである。
例えば、 A.B.C という名前の値が変化したと仮定する。 この時 A.B.C に対してエージェント X へ、 A.B に対してエージェント X と Y への送信要求が登録されていて、 通知文字列は全ての登録に共通であったとすると、 エージェント X へは A.B.C に関する変更通知メッセージのみが、 エージェント Y へは A.B に関する変更通知メッセージが、 送付される。
同様な場合で、 もしも A.B.C A.B に対する通知文字列の登録が異なっていると、 エージェント X へは A.B.C A.B に関する変更通知メッセージが、 各々固有の通知文字列をともなって送付される。

また、一つのトランザクションに基づいて複数の名前の値が変化した場合で、 幾つかの名前の変化に対して全く同じ通知メッセージが複数生成される場合には、 それらは一つの通知メッセージにまとめられる。

この通知メッセージはメッセージキューを介して エージェントのプログラムに渡される。 エージェントが意図しない時期にサーバが終了してしまって、 メッセージを配送する通信チャンネルが切れてしまった場合には、 メッセージキューは既に受け取っていたメッセージを提供した後に、 undef を返す。 エージェントは常に、 意図しないタイミングでのメッセージ通信チャネルの切断に備えなければならない。


 [M.T. HomePage]  [written & copyrighted by Masayuki Takata]