[Glue!] Notification & automatic update


変更通知メッセージ

Glue Logic の変更通知メッセージは、 事象駆動型のシステムを構築する上で非常に強力なサポートを提供する。 この機能を使うアプリケーションは特定の条件の成立の待ち合わせを、 単なるメッセージ待ちで実現することができる。

変更通知メッセージを要求するエージェントは、Glue Logic に対して、 監視を要求する名前とそのメッセージを送る エージェントを指定 する。 メッセージ送付先エージェントは、要求を行なうエージェント自身でも、 それ以外のエージェントでも、どちらでも構わない。

指定した名前の値が変更されると、変更通知メッセージが送られる。 名前に値の代入を行なうトランザクションが発生しても、 偶然その代入の前後で値が同じであった場合には、 変更通知メッセージは送られない。

構造を持った名前に対して変更通知メッセージの要求があった場合には、 その名前の示す構造の一部分にでも変化があれば、 構造全体に対する変更があったと見倣されて通知が送られる。 この時、送付先エージェントのそれぞれに対して、 変化のあった要素を包含する最も小さな構造に対して要求されていた処理を行なう。

名前の値が変わる原因は、その名前に対して代入を行なうトランザクションだけではない。 ある名前の値が変更され、その変更が他の名前にトリガを掛けた場合には、 トリガを掛けられた名前の値も変化することが多い。 このようにトリガを掛けられたような場合であっても、 名前の持つ値が変わればそれに関する変更通知メッセージが発生する。


データの自動更新

データの自動更新は Triggers, TriggeredBy, IfTriggered の各属性の利用によって行なわれる。 これらのうち、 Triggers と TriggeredBy は相補的な意味を持っているため、 どちらかだけを属性値として保持して、 他方はそれから仮想的に生成するようにしても良い。 ここでは Triggers の方を中心にして考えることにする。

ある名前の値を変更した場合、 データ監視サブシステムはその名前の Triggers 属性を調べて、 その値にリストアップされている名前に再評価フラグを立てる。 ひとつのトランザクションに起因するデータの変更が完了すると、 再評価フラグの立てられている名前について、 その名前の IfTriggered 属性の値を評価してその結果を主値とすると同時に、 再評価フラグを下ろす。

このアルゴリズムによると、 二つの名前が互いに相手を Triggers 属性に指定している場合には、 再評価のプロセスがいつまで経っても停止しない。 このような依存性の循環はシステムで自動的に検出するのは困難であるとともに、 多くの場合はアプリケーション側のミスであることが多い。 このため、 積極的にチェックを行なうのではなく、 再評価に時間が掛かり過ぎたり、 再評価が止まらなくなったりしないように、 Glue Logic 側で適当な guard を入れる。

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