以下、図面を参照して、実施形態にかかるイベントドリブンシステム、情報処理装置、イベントドリブンプログラムおよびイベントドリブン方法を説明する。実施形態において同一の機能を有する構成には同一の符号を付し、重複する説明は省略する。なお、以下の実施形態で説明するイベントドリブンシステム、情報処理装置、イベントドリブンプログラムおよびイベントドリブン方法は、一例を示すに過ぎず、実施形態を限定するものではない。また、以下の各実施形態は、矛盾しない範囲内で適宜組みあわせてもよい。
(第1の実施形態)
図1は、第1の実施形態にかかるシステム構成例を説明する説明図である。図1に示すように、ネットワーク分散型のイベントドリブンシステムでは、システム1Aとシステム1Bとが分散している。例えば、インタラクションロボットにネットワーク分散型のイベントドリブンシステムを用いる場合は、イベントを検知するセンサ側をシステム1Aとし、検知されたイベントに応じた動作を制御する制御側をシステム1Bとしてもよい。
システム1A、1Bは、クライアント2、メッセージプロバイダ3および転送モジュール4を有し、JMS(Java(登録商標)メッセージサービス)等を用いてクライアント2間およびシステム1A、1B間のメッセージの送受信を行う。クライアント2は、アプリケーションプログラム等であり、例えば、インタラクションロボットにおけるセンサ検知にかかるプログラム、制御にかかるプログラムなどである。メッセージプロバイダ3は、システム1A、1B内のクライアント2からのメッセージを管理し、他のクライアント2または転送モジュール4へ受け取ったメッセージを出力する。
転送モジュール4は、転送元のメッセージをキューイングし、転送先との接続状態を監視しながら、キューイングしたメッセージを転送するモジュールである。この転送モジュール4におけるメッセージ転送は、JMSなどのpub/sub(出版-購読型)のメッセージ基盤を使用し、非同期で動作してもよい。
例えば、システム1Aの転送モジュール4は、内部のメッセージプロバイダ3が管理するメッセージをキューイングする。そして、転送先であるシステム1Bとの通信接続が開始されたところで、キューイングしたメッセージをシステム1Bのメッセージプロバイダ3へ転送する。逆に、システム1Bの転送モジュール4は、転送先であるシステム1Aとの通信接続が開始されたところで、キューイングしたメッセージをシステム1Aのメッセージプロバイダ3へ転送する。これにより、システム1A、1B間におけるメッセージ転送が実現される。また、JMSのコネクションを長時間ロックしないように、メッセージは一旦テンポラリのキューに格納し、メッセージの受信はテンポラリのキューをポーリングするような実装にしてもよい。
図2は、第1の実施形態にかかる転送モジュール4の構成例を示すブロック図である。図2に示すように、転送モジュール4は、メッセージ受信部10、静的フィルタ部11、キュー格納部12、キュー13、動的フィルタ部14、キュー取出部15およびメッセージ送信部16を有する。
メッセージ受信部10は、メッセージプロバイダ3より転送元のメッセージ(転送元メッセージ)を受信し、受信した転送元メッセージを静的フィルタ部11へ出力する。静的フィルタ部11は、メモリなどに予め設定された静的フィルタ定義111に従い、転送元メッセージのフィルタリングを行って、フィルタリング後の転送元メッセージをキュー格納部12へ出力する。
静的フィルタ部11におけるフィルタリングは、転送元メッセージを選別してキュー13に格納するために行われるものであり、転送元メッセージに対してキュー13への格納時などに一度行われる。また、静的フィルタ定義111における選別の条件は、時間が経過しても変動することのない、静的なものである。
例えば、インタラクションロボットの例では、センサ側で検知されたイベントの中で制御側に通知するイベントは限られている。具体的には、人物の有無などのセンサの検知結果は制御側に通知するイベントである。これに対し、センサの異常を示すステータス情報などは制御側に通知しなくてもよく、センサ側で対処すべきイベントである。静的フィルタ部11では、このような通知の有無にかかる選別を行う。
キュー格納部12は、静的フィルタ部11より出力された転送元メッセージをキュー13へ格納する。キュー13は、転送元メッセージを順次格納するメインキュー131と、転送元メッセージを種別ごとに分けて格納する種別キュー132a、132b、132cとを有する。
キュー格納部12は、転送元メッセージをメインキュー131の最後へ格納するとともに、転送元メッセージのプロパティなどに記述された情報をもとに、メッセージにおけるイベントの種別を判定し、判定した種別ごとに種別キュー132a、132b、132cの最後へ格納する。
イベントの種別には、センサ検出による検出イベント、状態の変化などを示す状態イベント、アクチュエータなどへの指示を示す指示イベント、動作モードの変更などを示すモード変更イベントなど、様々なものがある。
例えば、インタラクションロボットの例では、検出イベントとして、ユーザがタッチセンサに触れた場合、笑顔を検出した場合、ユーザの手振りを検出した場合などがある。また、状態イベントとしては、人がいなくなったことを検出した場合、日中、夜間などの現在の時間帯の変化を検出した場合などがある。また、指示イベントとしては、タッチされて喜ぶ反応を行う反応動作、手振りに対して振り返す反応動作などがある。また、モード変更イベントとしては、人がいなくなったので省エネモードへ移行する場合、現在の時間帯が夜間なのでスリープモードへ移行する場合などがある。
これらのイベントの種別は、メッセージのプロパティなどに種別を示す情報として記述されている。キュー格納部12は、このプロパティなどを参照して、転送元メッセージにおけるイベントの種別に対応した種別キュー132a、132b、132cへメッセージの内容を格納する。
メインキュー131と、種別キュー132a、132b、132cとは、互いに参照可能な双方向のリスト構造を有し、格納されるメッセージ(要素)の参照から削除が容易となっている。
図3は、第1の実施形態にかかるキューの構成例を説明する説明図である。具体的には、図3では、メインキュー131と、種別キュー132aとを例示している。図3に示すように、メインキュー131と、種別キュー132aとには、転送元メッセージが要素MDk、要素SDkとして格納される。
ここで、要素MDk−1は要素MDkより一つ前の要素であり、要素MDk+1は要素MDkより次の要素である。同様に、要素SDk−1は要素SDkより一つ前の要素であり、要素SDk+1は要素SDkより次の要素である。
メインキュー131における各要素(MDk−1、MDk、MDk+1…)は、種々の情報を格納するための領域R1、R2、R3、R4を有する。領域R1は、転送元メッセージの内容を格納する。領域R2、R3は前の要素または次の要素への参照ための情報(例えばポインタ)を格納する。領域R4は、対応する種別キュー132aの要素への参照のための情報(例えばポインタ)を格納する。
種別キュー132aにおける各要素(SDk−1、SDk、SDk+1…)は、種々の情報を格納するための領域R11、R12、R13、R14を有する。領域R11は、対応するメインキュー131の要素への参照のための情報(例えばポインタ)を格納する。領域R12、R13は前の要素または次の要素への参照ための情報(例えばポインタ)を格納する。領域R4は、メッセージにおけるイベントの種別ごとの情報、すなわち、動的フィルタの実行に必要となる動的フィルタ判断情報を格納する。具体的には、検出イベントにおける検出内容、状態イベントにおける状態の内容、指示イベントにおける指示内容、モード変更イベントにおける変更後の動作モードなどが動的フィルタ判断情報として領域R4に格納される。
メインキュー131と、種別キュー132aとは、図3に示すような互いに参照可能な双方向のリスト構造であることから、メインキュー131に格納されたメッセージのイベントの種別ごとの操作(例えば、参照や削除)を容易に行うことができる。
図4は、メインキュー131のみと、種別キュー132a、132b、132cがある場合との比較を説明する説明図である。ここで、上段のケースC1はメインキュー131のみの場合を、下段のケースC2はメインキュー131の他に種別キュー132a、132b、132cがある場合を例示している。また、メインキュー131に格納されるメッセージは、イベントE1、E2、E3の3種類のイベントであるものとし、それぞれの寿命は期間T11、T12、T13であるものとする。また、イベントE1のメッセージは種別キュー132aに、イベントE2のメッセージは種別キュー132bに、イベントE3のメッセージは種別キュー132cに、それぞれメインキュー131と互いに参照可能に格納される。
図4に示すように、ケースC1では、イベントE1、E2、E3のメッセージを操作しようとする場合は、メインキュー131の要素を全検索しなければならない。例えば、イベントE1、E2、E3のそれぞれの寿命に応じてメッセージを削除する場合には、メインキュー131の要素を全検索して寿命が尽きたメッセージを削除していくこととなる。これに対し、ケースC2では、種別キュー132a、132b、132cのそれぞれに操作を行えばよく、メインキュー131の要素を全検索する必要がない。例えば、イベントE1、E2、E3のそれぞれの寿命に応じてメッセージを削除する場合には、種別キュー132a、132b、132cごとのメッセージの削除と、参照によるメインキュー131のメッセージの削除とを行えばよい。
動的フィルタ部14は、キュー13に格納されたメッセージに対して、メモリなどに予め設定された動的フィルタ定義141を適用したフィルタリングを行う。動的フィルタ定義141における選別の条件は、メッセージの要/不要の判断が時間の経過によって変動するものであり、動的なものである。したがって、動的フィルタ部14におけるフィルタリングは、転送元メッセージをキュー13に格納するタイミング、キュー13に格納された転送元メッセージを送信するタイミング、所定の時間間隔などでキュー13に対して実施される。
具体的には、メインキュー131に対する動的フィルタの場合、動的フィルタ部14は、メインキュー131の最初(古い)のメッセージから順に動的フィルタ定義141を適用し、メッセージを削除するか残すかの選別を行う。フィルタされる場合、動的フィルタ部14は、メインキュー131と、参照される種別キュー132a、132b、132cとから該当のメッセージを削除する。
また、種別キュー132a、132b、132cに対する動的フィルタの場合、動的フィルタ部14は、種別キュー132a、132b、132cの最初(古い)のメッセージから順に動的フィルタ定義141を適用し、メッセージを削除するか残すかの選別を行う。フィルタされる場合、動的フィルタ部14は、種別キュー132a、132b、132cと、参照されるメインキュー131から該当のメッセージを削除する。
また、メッセージの要/不要の判断が時間の経過によって変動する選別の条件は、イベントの種別によって異なる。具体的には、インタラクションロボットの例では、検出イベント、状態イベント、指示イベントまたはモード変更イベントによって異なる。ユーザがタッチセンサに触れたなどの検出イベントや反応動作などの指示イベントは、即座に応答や指示が必要であるが、時間の経過によって必要としなくなる場合がある。また、状態イベントやモード変更イベントなどは、多少の遅れは許容できるが、確実に転送することが望まれる。したがって、動的フィルタ定義141では、例えば、イベントの種別ごとにフィルタが定義されている。
図5は、動的フィルタ定義141を説明する説明図である。図5に示すように、動的フィルタ定義141には、タッチセンサのイベント、人の入退場のイベント、発話指示のイベントなどのイベントごとの定義D1〜D3が記述されている。具体的には、イベントごとの種別キュー132a、132b、132cにおけるキューサイズ、適用するフィルタの種類と、フィルタの条件などが記述されている。このフィルタの種類については、イベントの有効時間(寿命)でフィルタする「有効時間フィルタ」、所定の条件を満たした状態イベントのメッセージを削除する「イベントフィルタ」および所定の転送レートでメッセージを転送するための間引きを行う「転送レートフィルタ」などがある。
例えば、定義D1におけるタッチセンサのイベントについては、キューサイズ「20」とし、有効時間(s)を「3」とする「有効時間フィルタ」と、「転送レートフィルタ」とが定義されている。転送レートフィルタでは、キュー13からメッセージの間引きを開始するタイミングを「5」、間引きで無効にするメッセージの属性を「タッチ」およびキューの最大保持数を「10」とする間引きの条件が定義されている。このため、タッチセンサのイベントについては、3秒だけキュー13に保持され、3秒経過後には動的フィルタ部14によって削除される。また、タッチセンサのイベントについては、転送レートフィルタで定義された条件で動的フィルタ部14によりキュー13からメッセージが間引きされる。
また、定義D2における入退場イベントについては、有効時間を「600」とする「有効時間フィルタ」が定義されている。このため、入退出イベントについては、10分間保持される。
また、定義D3における発話指示イベントについては、キューサイズ「1」とし、人(A)の退出イベントを削除の条件とする「イベントフィルタ」と、有効時間(s)を「60」とする「有効時間フィルタ」とが定義されている。このため、発話指示イベントについては、60秒(1分)間だけキュー13に保持され、1分経過後には動的フィルタ部14によって削除される。また、人(A)が退出した条件を満たす場合も動的フィルタ部14によって削除される。
キュー取出部15は、キュー13に格納されたメッセージを取り出しメッセージ送信部16へ出力する。具体的には、キュー取出部15は、メインキュー131の最初(古い)のメッセージから順に取り出し、メッセージ送信部16へ出力する。メッセージ送信部16は、キュー取出部15より出力されたメッセージをネットワークなどを介して接続された転送先(例えば、システム1Aにおけるシステム1B)へ転送する。キュー取出部15は、転送先へのメッセージの転送に成功したところで、取り出したメインキュー131の要素と、対応する種別キュー132a、132b、132cの要素とを削除する。なお、キュー格納部12によりキュー13へメッセージを格納する処理と、キュー取出部15によりキュー13からメッセージを取り出す処理とは、データの整合性を取るために排他処理で行われる。
次に、転送元メッセージの受信時に行われる処理を説明する。図6は、メッセージ受信の一例を示すフローチャートである。
図6に示すように、処理が開始されると、メッセージ受信部10は、メッセージプロバイダ3からの転送元メッセージの受信を待ち(S1)、メッセージの有無を判定する(S2)。メッセージがない場合(S2:NO)、メッセージ受信部10は、S1へ処理を戻して待機する。
メッセージが有る場合(S2:YES)、メッセージ受信部10はメッセージプロバイダ3から転送元メッセージを受信し(S3)、メッセージを受信した時刻を取得する(S4)。次いで、静的フィルタ部11は、静的フィルタ定義111をもとに、メッセージ受信部10が受信した転送元メッセージの静的フィルタ処理を行って(S5)、選別によりメッセージが有効であるか否かを判定する(S6)。メッセージが有効でない場合(S6:NO)、静的フィルタ部11はS1へ処理を戻す。したがって、転送元メッセージはキュー13に格納されない。
メッセージが有効である場合(S6:YES)、動的フィルタ部14は、有効であると判定されたメッセージのイベント種別をプロパティ等を参照して判断する(S7)。次いで、動的フィルタ部14は、動的フィルタ定義141をもとに、判断されたイベント種別の種別キューに格納されたメッセージに対して動的フィルタを適用する(S8)。次いで、キュー格納部12は、有効であると判定されたメッセージにかかる要素をメインキュー131に追加する(S9)。
次いで、キュー格納部12は、判断されたイベント種別をもとに、メッセージから動的フィルタ判断情報を生成する(S10)。具体的には、検出イベントにおける検出内容、状態イベントにおける状態の内容、指示イベントにおける指示内容、モード変更イベントにおける変更後の動作モードなどが生成される。例えば、検出イベントにおけるタッチセンサイベントでは、タッチセンサの検出結果とともに、有効時間を判定するために、S4で取得した時刻などを含む情報が動的フィルタ判断情報として生成される。
次いで、キュー格納部12は、生成した動的フィルタ判断情報を含む要素をS9で判断された種別に対応する種別キューへ追加する(S11)。次いで、キュー格納部12は、メインキュー131へ追加した要素と種別キューへ追加した要素とが互いに参照できるように、メインキュー131および種別キューの互いの要素にリファレンスを保持させる(S12)。
次いで、動的フィルタ部14は、動的フィルタ定義141を参照し、種別キュー132a、132b、132cにおけるキューサイズ(最大キュー数(maxA))を取得し(S13)、現在の種別キュー132a、132b、132cのキュー数(cntA)を取得する(S14)。次いで、キュー格納部12は、cntA>maxAであるか否かを判定する(S15)。
ここで、現在のキュー数が最大キュー数を超えない場合(S15:NO)、動的フィルタ部14はそのままS1へ処理を戻す。また、現在のキュー数が最大キュー数を超える場合(S15:YES)、動的フィルタ部14は、種別キュー132a、132b、132cにおける最初(古い)の要素を削除し(S16)、この削除した要素と対応するメインキュー131の要素を削除して(S17)、S1へ処理を戻す。これにより、動的フィルタ部14は、種別キュー132a、132b、132cにおけるキューサイズが動的フィルタ定義141に定義されたキューサイズを超えないようにすることができる。
次に、動的フィルタの適用について説明する。図7は、メインキュー131に対する動的フィルタを適用する処理の一例を示すフローチャートであり、例えば、送信時のフローから呼ばれる処理の一例である。
図7に示すように、処理が開始されると、動的フィルタ部14は、メインキュー131の要素を最初(古い)の要素から順に取得し(S20)、要素を取得できたか否かを判定する(S21)。取得できなかった場合(S21:NO)、メインキュー131のすべての要素に対して動的フィルタを適用したことから、動的フィルタ部14は処理を終了する。
取得できた場合(S21:YES)、動的フィルタ部14は、種別キュー132a、132b、132cにおいて対応する要素を参照し、メッセージのイベント種別を判断する(S22)。次いで、動的フィルタ部14は、動的フィルタ定義141を取得し(S23)、対応する種別キュー132a、132b、132cの要素を取得する(S24)。次いで、動的フィルタ部14は、取得した動的フィルタ定義141と、種別キュー132a、132b、132cの要素に含まれる動的フィルタ判断情報とを使って動的フィルタを適用し(S25)、転送が不要な要素であるか否かを選別する(S26)。なお、動的フィルタ定義141と動的フィルタ判断情報とを使った動的フィルタの詳細は後述する。
動的フィルタの適用の結果、転送が不要であると判定された場合(S26:YES)、動的フィルタ部14は、対象の要素について、メインキュー131からの削除と(S27)、種別キュー132a、132b、132cからの削除(S28)とを行い、S20へ処理を戻す。なお、S26において否定の判定である場合(S26:NO)、動的フィルタ部14は、対象の要素について削除することなくそのまま残し、処理を終了する。これにより、転送が必要なもの(例えば、削除されることなく残された要素)が、送信処理によって転送されることとなる。
図8は、種別キュー132a、132b、132cに対する動的フィルタを適用する処理の一例を示すフローチャートである。
図8に示すように、処理が開始されると、動的フィルタ部14は、種別キュー132a、132b、132cの要素を最初(古い)の要素から順に取得し(S30)、要素を取得できたか否かを判定する(S31)。取得できなかった場合(S31:NO)、種別キュー132a、132b、132cのすべての要素に対して動的フィルタを適用したことから、動的フィルタ部14は処理を終了する。
取得できた場合(S31:YES)、動的フィルタ部14は、動的フィルタ定義141を取得し(S32)、取得した動的フィルタ定義141と、種別キュー132a、132b、132cの要素に含まれる動的フィルタ判断情報とを使って動的フィルタを適用する(S33)。この動的フィルタの適用により、動的フィルタ部14は、転送が不要な要素であるか否かを選別する(S34)。
動的フィルタの適用の結果、転送が不要であると判定された場合(S34:YES)、動的フィルタ部14は、対象の要素について、メインキュー131の要素を取得し(S35)、メインキュー131からその要素を削除する(S36)。次いで、動的フィルタ部14は、対象の要素について、種別キュー132a、132b、132cからの削除を行い(S37)、S30へ処理を戻す。なお、なお、S34において否定の判定である場合(S34:NO)、動的フィルタ部14は、対処の要素について削除することなくそのまま残し、S30へ処理を戻す。
次に、動的フィルタ定義141と動的フィルタ判断情報とを使った動的フィルタの適用について説明する。図9は、動的フィルタの適用の一例を示すフローチャートである。
図9に示すように、S25、S33などで処理が開始されると、動的フィルタ部14は、動的フィルタ定義141をもとに、動的フィルタの対象となる要素のイベント種別について定義されているフィルタの内容を判定する(S40)。イベント種別については、上述した「有効時間フィルタ」、「イベントフィルタ」および「転送レートフィルタ」等がある。図9のフローでは、例えば、図5の動的フィルタ定義141を、全ての定義が終了するまで(S56:YES)全て順に処理する。
フィルタの内容が「有効時間フィルタ」である場合、動的フィルタ部14は、要素に含まれる動的フィルタ判断情報を参照し、要素のイベントが動的フィルタ定義141に定義された有効時間を満たすか否かを判定して、メッセージの選別を行う。
具体的には、動的フィルタ部14は、現在時刻(c)を取得し(S41)、動的フィルタ判断情報であるイベントの時刻(t)に、動的フィルタ定義141に定義された有効時間(T)を加えたt+Tについて、c>t+Tであるか否かを判定する(S42)。c>t+Tでない場合(S42:NO)、現在時刻はイベントの有効時間内であることから、動的フィルタ部14は、メッセージを有効と判断(選別)する(S43)。
また、c>t+Tである場合(S42:YES)、現在時刻はイベントの有効時間を過ぎていることから、動的フィルタ部14は、メッセージを無効と判断(選別)する(S44)。メッセージを無効とした場合(S44)は、そのメッセージは転送不要となったことから、他の動的フィルタ定義141の処理を行わずに処理を抜ける(終了する)こととなる。
フィルタの内容が「イベントフィルタ」である場合、動的フィルタ部14は、要素に含まれる動的フィルタ判断情報を参照し、要素のイベントが動的フィルタ定義141に定義された状態イベントであるか否かを判定して、メッセージの選別を行う。
具体的には、動的フィルタ部14は、動的フィルタ定義141に定義された状態イベントの条件を取得し(S45)、要素に含まれる動的フィルタ判断情報が示すイベントの状態が定義された条件を満たすか否かを判定する(S46)。例えば、図5に例示した定義D3であり、要素に含まれるイベントの状態が人の退室である場合は、条件を満たすものと判定される。
条件を満たさない場合(S46:NO)、「イベントフィルタ」でフィルタリングされるメッセージでないことから、動的フィルタ部14は、メッセージを有効と判断(選別)する(S47)。また、条件を満たす場合(S46:YES)、「イベントフィルタ」でフィルタリングされるメッセージであることから、動的フィルタ部14は、メッセージを無効と判断(選別)する(S48)。メッセージを無効とした場合(S48)は、そのメッセージは転送不要となったことから、他の動的フィルタ定義141の処理を行わずに処理を抜ける(終了する)こととなる。
フィルタの内容が「転送レートフィルタ」である場合、動的フィルタ部14は、単位時間あたりにおけるキューの格納速度(Rin)と、キューの取り出し速度(Rout)とを取得する(S49、S50)。このキューの格納速度および取り出し速度は、単位時間あたりにキュー13へ格納されたメッセージの数や、取り出されたメッセージの数を計数することで算出できる。
次いで、動的フィルタ部14は、取得したRin、Routをもとに、動的フィルタ定義141に定義されたメッセージの間引きを発動するための条件を満たすか否かを判定する(S51)。具体的には、図5に例示した定義D4の間引きを開始するタイミング(Th)と、キューの最大保持数(MAXQ)とをもとに、MAXQ/(Rin−Rout)>Th等の発動の条件を満たすか否かを判定する。
発動の条件を満たさない場合(S51:YES)、動的フィルタ部14は、メッセージの間引きをおこなうことなく、メッセージを有効と判断(選別)する(S52)。
発動の条件を満たす場合(S51:NO)、動的フィルタ部14は、動的フィルタ定義141に定義された間引きで無効にするメッセージ属性(YY)に相当するメッセージを、所定の間隔(例えば、1/(Rin−Rout)に1件)で間引きする。具体的には、動的フィルタ部14は、メッセージの属性(y)がYYであり、かつ、T−t>1/(Rin−Rout)であるか否かを判定する(S53)。動的フィルタ部14は、S53において肯定である場合にメッセージを無効と判断(選別)し(S54)、否定である場合にメッセージを有効と判断(選別)する(S55)。メッセージを無効とした場合(S54)は、そのメッセージは転送不要となったことから、他の動的フィルタ定義141の処理を行わずに処理を抜ける(終了する)こととなる。
メッセージを有効とした場合(S43、S47、S52、S55)、動的フィルタ部14は、動的フィルタ定義141の全ての定義についてS40〜S55の処理が終了したか否かを判定する(S56)。全ての定義について終了している場合(S56:YES)、動的フィルタ部14は処理を終了する。S56において未終了である場合(S56:NO)、動的フィルタ部14は、S40へ処理を戻し、未終了である定義についての処理を継続する。
次に、転送元メッセージの送信時に行われる処理を説明する。図10は、メッセージ送信の一例を示すフローチャートである。
図10に示すように、処理が開始されると、転送モジュール4は、一定時間処理を待機する(S60)。次いで、動的フィルタ部14は、動的フィルタ定義141に対して動的フィルタを適用する(S61)。この動的フィルタの適用は、一定時間ごとであってもよいし、転送先にメッセージを送信する際(S66)に行ってもよい。
次いで、キュー取出部15は、メインキュー131の要素を最初(古い)の要素から順に取得し(S62)、取得できたか否かを判定する(S63)。取得できなかった場合(S63:NO)は、転送するメッセージがないことから、キュー取出部15はS60へ処理を戻す。
取得できた場合(S63:YES)、メッセージ送信部16は、転送先との接続確認を行い(S64)、接続中であるか否かを判定する(S65)。接続中でない場合(S65:NO)、転送先との接続がないことから、メッセージ送信部16はS60へ処理を戻す。
接続中である場合(S65:YES)、メッセージ送信部16は、キュー取出部15がメインキュー131より取得したメッセージを送信し(S66)、受領通知などを確認することで送信が成功したか否かを判定する(S67)。送信が失敗した場合(S67:NO)、メッセージが転送先に送れなかったことから、メッセージ送信部16はS60へ処理を戻す。
送信が成功した場合(S67:YES)、メッセージが転送先に送れたことから、キュー取出部15は、送信したメッセージに対応する種別キュー132a、132b、132cの要素を取得する(S68)。次いで、キュー取出部15は、送信したメッセージの要素を、メインキュー131および種別キュー132a、132b、132cから削除し(S69、S70)、S61へ処理を戻す。
このように、動的フィルタ部14は、動的フィルタ定義141による種別キュー132a、132b、132cごとのフィルタ定義をもとに、種別キュー132a、132b、132cごとにフィルタを適用して、種別キュー132a、132b、132cに保持されるメッセージを削除するか、残して転送先へ転送するかを決定する。そして、動的フィルタ部14は、動的フィルタ定義141による決定結果に基づいて、メインキュー131に保持されるメッセージの保持状態を更新する。このため、キュー13には、時間の経過とともに、転送に必要なメッセージが残されることとなる。したがって、システム1A、1Bにおけるイベントドリブンシステムでは、キュー13によるメッセージ転送の効率をよくすることができる。
(第2の実施形態)
図11は、第2の実施形態にかかるシステム構成例を説明する説明図である。図11に示すように、システム1Cが転送する転送先がシステム1A、1Bであり、それぞれの転送ルール(例えば、通信プロトコル)が異なる場合は、それぞれの転送ルールに対応した転送モジュール4A、4Bを有するように構成してもよい。
この第2の実施形態では、転送モジュール4A、4Bについては、メッセージ送信部16が転送先にメッセージを送る際の転送ルールを変更するだけでよく、他の構成は第1の実施形態と同様の構成とすることができる。ただし、転送モジュール4A、4Bにおいて処理が重複する場合には、その分のリソースを用意する必要がある。
(第3の実施形態)
図12は、第3の実施形態にかかるシステム構成例を説明する説明図である。図12に示すように、第3の実施形態にかかるシステム1Dは、共通の転送モジュール4Dによりシステム1A、1B、1Cへの転送を行う点が第2の実施形態とは異なる。
図13は、第3の実施形態にかかる転送モジュール4Dの構成例を示すブロック図である。図13に示すように、転送モジュール4Dは、転送先ごとの転送スレッド17A、17Bを用意している。これにより、転送ルールの異なる複数のシステムへ転送する場合であっても、メッセージ受信部10、静的フィルタ部11、キュー格納部12、キュー13および動的フィルタ部14を共通化できる。
図14は、第3の実施形態にかかるキュー13の構成例を説明する説明図である。図14に示すように、メインキュー131の要素は、転送先毎の転送済みフラグを格納する領域R5を有する。この転送済みフラグは、転送先ごとの転送の有無を示すフラグである。転送スレッド17A、17Bは、領域R5を参照することで、全てのスレッドで転送が完了したか否かを判定することができる。
ここで、第3の実施形態における動的フィルタの適用について説明する。図15は、メインキュー131に対する動的フィルタの一例を示すフローチャートである。
図15に示すように、処理が開始されると、動的フィルタ部14は、メインキュー131のチェック済みの位置の次の要素を順次取得し(S101)、要素を取得できたか否かを判定する(S102)。取得できなかった場合(S102:NO)、メインキュー131のすべての要素に対して動的フィルタを適用したことから、動的フィルタ部14は処理を終了する。なお、メインキュー131のチェック済み位置は、メインキュー141のフィルタと共通の値であり、転送スレッド単位で管理する変数等である。このように、メインキュー131のチェック済み位置は、転送スレッドごとに管理されており、S101、S102でチェックした場合に更新される。これにより、次にメインキュー131へ動的フィルタを適用する場合は、更新後のチェック済み位置から開始される。
取得できた場合(S102:YES)、動的フィルタ部14は、取得した要素の転送済みフラグが「true」であるか否かを判定する(S103)。「true」である場合(S103:YES)は、取得した要素については既に処理済み(転送済みまたはフィルタ済み)である。したがって、この場合は動的フィルタを適用することなく、動的フィルタ部14はS110へ処理を進める。
「true」でない場合(S103:NO)、動的フィルタ部14は、前述したS22〜S26と同様に動的フィルタを適用する処理を行う(S104〜S108)。
次いで、動的フィルタの適用の結果、転送が不要であると判定された場合(S108:YES)、動的フィルタ部14は、自身の転送済みフラグを「true」に設定し(S109)、転送済みフラグを参照して全てのスレッドが要素を転送済みであるか否かを判定する(S110)。
全てのスレッドが要素を転送済みである場合(S110:YES)、動的フィルタ部14は、対象の要素について、種別キュー132a、132b、132cの要素を削除し(S111)、メインキュー131からの削除を行って(S112)、S101へ処理を戻す。なお、S108において否定の判定であり(S108:NO)、転送すべきメッセージを見つけた時点で、動的フィルタ部14は処理を終了する。
図16は、種別キュー132a、132b、132cに対する動的フィルタの一例を示すフローチャートである。
図16に示すように、処理が開始されると、動的フィルタ部14は、種別キュー132a、132b、132cの要素を最初(古い)の要素から順に取得し(S120)、要素を取得できたか否かを判定する(S121)。取得できなかった場合(S121:NO)、種別キュー132a、132b、132cのすべての要素に対して動的フィルタを適用したことから、動的フィルタ部14は処理を終了する。
取得できた場合(S121:YES)、動的フィルタ部14は、対応するメインキュー131の要素を取得し(S122)、取得した要素の転送済みフラグが「true」であるか否かを判定する(S123)。「true」である場合(S123:YES)は、いずれかの転送先へ転送済みであり、フィルタすることで転送先ごとのメッセージに整合性が取れなくなる。したがって、この場合は動的フィルタを適用することなく、動的フィルタ部14はS128へ処理を進める。
「true」でない場合(S123:NO)、動的フィルタ部14は、前述したS32〜S34と同様に動的フィルタを適用する処理を行う(S124〜S126)。
次いで、動的フィルタの適用の結果、転送が不要であると判定された場合(S126:YES)、動的フィルタ部14は、自身の転送済みフラグを「true」に設定し(S127)、転送済みフラグを参照して全てのスレッドが要素を転送済みであるか否かを判定する(S128)。
全てのスレッドが要素を転送済みである場合(S128:YES)、動的フィルタ部14は、対象の要素について、種別キュー132a、132b、132cの要素を削除する(S129)。次いで、動的フィルタ部14は、メインキュー131からの削除を行って(S130)、処理対象を次の要素とするようにS120へ処理を戻す。
次に、第3の実施形態において、転送元メッセージの送信時に行われる処理を説明する。図17は、メッセージ送信の一例を示すフローチャートである。
図17に示すように、処理が開始されると、転送モジュール4は、一定時間処理を待機する(S140)。次いで、動的フィルタ部14は、動的フィルタ定義141に対して動的フィルタを適用する(S141)。この動的フィルタの適用は、一定時間ごとであってもよいし、転送先にメッセージを送信する際(S146)に行ってもよい。
次いで、キュー取出部15は、メインキュー131のチェック済み位置の次の要素を取得し(S142)、取得できたか否かを判定する(S143)。取得できなかった場合(S143:NO)は、転送するメッセージがないことから、キュー取出部15はS140へ処理を戻す。なお、メインキュー131のチェック済み位置は、メインキュー141のフィルタと共通の値であり、転送スレッド単位で管理する変数等である。このように、メインキュー131のチェック済み位置が転送スレッドごとに管理されていることから、転送ルールの異なる複数のシステムへ転送する場合の処理を効率的の行うことができる。
取得できた場合(S143:YES)、メッセージ送信部16は、転送先との接続確認を行い(S144)、接続中であるか否かを判定する(S145)。接続中でない場合(S145:NO)、転送先との接続がないことから、メッセージ送信部16はS140へ処理を戻す。
接続中である場合(S145:YES)、メッセージ送信部16は、キュー取出部15がメインキュー131より取得したメッセージを送信し(S146)、受領通知などを確認することで送信が成功したか否かを判定する(S147)。送信が失敗した場合(S147:NO)、メッセージが転送先に送れなかったことから、メッセージ送信部16はS140へ処理を戻す。
送信が成功した場合(S147:YES)、メッセージが転送先に送れたことから、キュー取出部15は、送信したメッセージに対応するメインキュー131の要素の転送済みフラグを「true」に設定し(S148)、S141へ処理を戻す。
以上のように、第3の実施形態では、スレッドが別となることから、自身のスレッドで転送したとしても、全てのスレッドで転送が完了するまでは、キュー13に格納されたメッセージを削除できない。したがって、転送スレッド17A、17Bにおいて転送が完了した後の、動的フィルタ部14の適用により、キュー13に格納されたメッセージを削除してもよい。
(第4の実施形態)
第4の実施形態では、第3の実施形態と同様に、共通の転送モジュール4Dによりシステム1A、1B、1Cへメッセージを転送するが(図12参照)、その転送先(宛先)がメッセージによって異なる。
転送モジュール4Dが転送するメッセージは、転送先が不定であり、転送するメッセージもメッセージによって転送先が異なるようなユースケースがある。この場合、メッセージの内容に転送先が示されている。例えば、メッセージのヘッダ等にメッセージのメタ情報に転送先を判断する情報が書かれている。一例として、送信先のユーザ名、トピック名、グループ名がメタ情報に含まれており、これらの情報をもとに、実際の転送先を決定することができる。
この転送先の決定は、静的フィルタ部11(図13参照)で行う。そして、キュー格納部12は、メインキュー131および種別キュー132a、132b、132cへメッセージを格納する際に、決定された転送先を示す宛先情報を付与する。この宛先情報の付与は、例えば、転送先毎の転送済みフラグを格納する領域R5(図14参照)において、フラグとともに宛先情報を格納してもよい。
図18は、第4の実施形態にかかる静的フィルタを適用する処理の一例を示すフローチャートである。図18に示すように、静的フィルタ部11は、静的フィルタの定義情報に記述されたフィルタリングの定義に従って、静的フィルタの適用を開始する。この時、所定のタイミング、例えば、各メッセージにおける前の静的フィルタ(S150)および次の静的フィルタ(S154)の合間において、メッセージの転送先を決定して宛先情報を書き込む処理(S151〜S153)を行う。なお、S151〜S153が行われるタイミングは、全ての静的フィルタを行う前または行った後などであってもよく、図示例に限定しない。
具体的には、静的フィルタ部11は、メッセージのメタ情報を解釈する(S151)。これにより、メタ情報に含まれるユーザ名、トピック名、グループ名などの、メッセージの宛先となる情報が取得される。
次いで、静的フィルタ部11は、メタ情報の解釈をもとに宛先(ユーザ名、トピック名、グループ名に対応する宛先)一覧を決定する(S152)。この宛先一覧は、単数または複数の宛先でよい。例えば、特定のユーザ名に対応する1人のユーザを宛先とする宛先一覧としてもよい。また、グループ名に対応するグループにおいて所属する複数のユーザを宛先とする宛先一覧としてもよい。
次いで、キュー格納部12は、メインキュー131および種別キュー132a、132b、132cに格納するメッセージを包含するデータ構造(例えば、領域R5)に決定された宛先一覧(宛先リスト)を書き込む(S153)。
キュー取出部15は、メッセージとともに領域R5に格納された宛先情報を取り出してメッセージ送信部16へ出力する。メッセージ送信部16は、全ての転送先のリストに対する転送済みフラグを管理する代わりに、該当する宛先に対してのみ送信済みフラグを管理するようする事により、メッセージ毎に異なる転送先への転送を実現する。
(第5の実施形態)
図19は、第5の実施形態にかかるシステム構成例を説明する説明図である。図19に示すように、システム1E間においては、例えば、転送先または転送元のクライアント2の要求(新たに通知したいイベントの種別が発生した場合等)によって、メッセージの転送ポリシーを動的に変更する場合がある。
例えば、転送ポリシーを変更する場合としては、転送先のクライアント2やシステム1Eの都合で転送元の特定の情報が必要となる場合がある。また、転送元のクライアント2やシステム1Eの都合で、転送先のシステム1Eに所定の情報を伝える場合がある。この転送ポリシーは、静的フィルタまたは動的フィルタの定義として示される。
システム1Eの転送モジュール4Eは、動的に転送ポリシー(静的フィルタまたは動的フィルタの定義)を変更する。具体的には、転送モジュール4Eは、静的フィルタまたは動的フィルタの定義を、別のシステムやシステム1E内のクライアント2の要求に応じて、追加/削除を可能としている。
図20は、第5の実施形態にかかる転送モジュール4Eの構成例を示すブロック図である。図20に示すように、転送モジュール4Eは、転送ポリシー管理部18と、記憶部19とを有している。
記憶部19は、静的フィルタ定義111および動的フィルタ定義141を記憶する。転送ポリシー管理部18は、別のシステムやシステム1E内のクライアント2からの、静的・動的フィルタの追加/削除等の要求を元に、記憶部19に記憶された静的フィルタ定義111および動的フィルタ定義141を更新する。具体的には、別のシステムやシステム1E内のクライアント2から通知された新たな定義を、静的フィルタ定義111および動的フィルタ定義141に反映する。
静的フィルタ部11および動的フィルタ部14は、更新された静的フィルタ定義111および動的フィルタ定義141に従ったフィルタ処理を行う。このため、システム1Eでは、動的に変更される転送ポリシーに応じたメッセージの転送を実現できる。
(第6の実施形態)
第6の実施形態では、イベントメッセージにおける一部のデータ領域にフィルタリングを行うことで、転送先の接続が不安定な場合等、送信が滞る場合にデータの転送量を適正化する。
例えば、転送モジュール4Dによりシステム1A、1B、1Cへメッセージを転送する場合など(図12参照)、転送先が不定の場合は、転送先ごとに通信速度や接続の安定度が異なることがある。この時、転送先によってはイベントメッセージの転送が滞ってしまう場合がある。一例として、画像を転送する場合等、イベントメッセージが大きなデータを含む場合は、転送が滞る可能性が高くなる。
しかしながら、画像を含むイベントメッセージの種別として一律にフィルタリングを行うと、イベントメッセージに含まれる画像以外の情報もフィルタリングされてしまう。例えば、画像と、画像処理の結果などの負荷情報とがイベントメッセージとして転送される場合には、転送が滞らないように画像をフィルタし、負荷情報を転送したいケースがある。
第6の実施形態では、動的フィルタ定義141において、イベントメッセージで画像等が格納される所定のデータ領域の有効時間(T2)を定義する。そして、動的フィルタ部14は、有効時間(T2)をもとに、キュー13に保持されるイベントメッセージの所定のデータ領域を削除するか否かを決定して、データのフィルタリングを行う。
図21は、第6の実施形態にかかる動的フィルタの適用の一例を示すフローチャートである。図21に示すように、動的フィルタ部14は、現在時刻(c)を取得し(S41)、動的フィルタ判断情報であるイベントの時刻(t)に、動的フィルタ定義141に定義された有効時間(T1)を加えたt+T1について、c>t+Tであるか否かを判定する(S42)。c>t+T1でない場合(S42:NO)、現在時刻はイベントの有効時間内であることから、動的フィルタ部14は、イベントの時刻(t)に所定のデータ領域の有効時間(T2)を加えたt+T2について、c>t+T2であるか否かを判定する(S43a)。
c>t+T2である場合(S43a:YES)、現在時刻は所定のデータ領域の有効時間を過ぎていることから、動的フィルタ部14は、該当するデータ領域の削除、すなわちイベントメッセージにおけるデータの部分削除を行う(S43b)。また、c>t+T2でない場合(S43a:NO)、動的フィルタ部14は、メッセージは有効と判断(選別)する(S43c)。
また、c>t+T1である場合(S42:YES)、現在時刻はイベントの有効時間を過ぎていることから、動的フィルタ部14は、メッセージを無効と判断(選別)する(S44)。メッセージを無効とした場合(S44)は、そのメッセージは転送不要となったことから、他の動的フィルタ定義141の処理を行わずに処理を抜ける(終了する)こととなる。
第6の実施形態では、上述した動的フィルタの適用により、例えば、通信が遅い転送先に対して大きなデータを送ろうとし続けて転送が滞るような現象を、大きなデータが格納されるデータ領域を削除することで回避できる。また、イベントメッセージに含まれる必要な情報を、適切な時間で転送することが可能となる。
また、上記の実施形態では、キュー13は、メインキュー131と、種別キュー132a、132b、132cとを有する構成としたが、メインキュー131がなく、種別キュー132a、132b、132cとする構成であってもよい。この構成では、転送スレッド17A、17Bが種別キュー132a、132b、132cごとの最後のイベントメッセージの時刻を見て、どのイベントメッセージを送るかを決定すればよい。この場合、キュー13にメインキュー131を用意することなく、キュー13に格納されたイベントメッセージを順番どおりに転送できるが、メインキュー131を参照して順番どおりに転送する場合と比較すると、処理効率が落ちることとなる。
また、上記の実施形態では、1つの転送先に1つの転送スレッドの場合を例示しているが、転送先が不定の場合には、転送先が多数になることがある。このように、転送先が不定である場合は、転送先ごとに転送スレッドを用意するのは効率的ではない。したがって、転送モジュール4D、4Eは、予め一定数の転送スレッドを動作させ(スレッドプール)、スレッドプール内の転送スレッドの中から転送先を選択して処理するようにしてもよい。
また、上記の実施形態では、センサ側のシステムと制御側のシステムとが分散したインタラクションロボットを例示して説明したが、これに限定されない。例えば、パーソナルコンピュータ(PC:Personal Computer)を始めとする固定端末や、携帯電話機、PHS(Personal Handyphone System)やPDA(Personal Digital Assistant)などの移動体端末による情報処理装置において実現してもよい。
また、図示した各装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、システム1A、1B、1C、1D、1Eの各処理部が適宜統合されてもよい。また、各処理部の処理が適宜複数の処理部の処理に分離されてもよい。さらに、各処理部にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
また、上記の実施形態で説明した各種の処理は、予め用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図22を用いて、上記の実施形態と同様の機能を有するイベントドリブンプログラムを実行するコンピュータの一例について説明する。
図22は、イベントドリブンプログラム270aを実行するコンピュータ200の一例について説明するための図である。図22に示すように、コンピュータ200は、操作部210aと、スピーカ210bと、カメラ210cと、マイク210d、ディスプレイ220と、通信部230とを有する。さらに、このコンピュータ200は、CPU250と、ROM260と、HDD270と、RAM280と有する。これら210〜280の各部はバス240を介して接続される。
HDD270には、システム1A、1B、1C、1D、1Eの各処理部と同様の機能を発揮するイベントドリブンプログラム270aが予め記憶される。このイベントドリブンプログラム270aについては、上述した実施形態で示した各構成要素と同様、適宜統合又は分離してもよい。すなわち、HDD270に格納される各データは、常に全てのデータがHDD270に格納される必要はなく、処理に必要なデータのみがHDD270に格納されればよい。
そして、CPU250が、イベントドリブンプログラム270aをHDD270から読み出してRAM280に展開する。これによって、イベントドリブンプログラム270aは、イベントドリブンプロセス280aとして機能する。このイベントドリブンプロセス280aは、HDD270から読み出した各種データを適宜RAM280上の自身に割り当てられた領域に展開し、この展開した各種データに基づいて各種処理を実行する。なお、イベントドリブンプロセス280aは、システム1A、1B、1C、1Dの各処理部にて実行される処理を含む。また、CPU250上で仮想的に実現される各処理部は、常に全ての処理部がCPU250上で動作する必要はなく、処理に必要な処理部のみが仮想的に実現されればよい。
なお、上記のイベントドリブンプログラム270aについては、必ずしも最初からHDD270やROM260に記憶させておく必要はない。例えば、コンピュータ200に挿入されるフレキシブルディスク、いわゆるFD、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に各プログラムを記憶させる。そして、コンピュータ200がこれらの可搬用の物理媒体から各プログラムを取得して実行するようにしてもよい。また、公衆回線、インターネット、LAN、WANなどを介してコンピュータ200に接続される他のコンピュータまたはサーバ装置などに各プログラムを記憶させておき、コンピュータ200がこれらから各プログラムを取得して実行するようにしてもよい。