(57)【要約】【課題】処理フローを単純な構成に構築し、処理フローに含まれる無駄な処理の実行を削減することを可能にする。【解決手段】それぞれに処理を規定したノード同士を、ある処理によって発生し他の処理に利用されるイベントで上流から下流に接続して処理フローを実現するイベントフローシステムであって、複数のノードと、１つ以上のイベントと、下流ノードから該下流ノードよりも上流にある上流ノードへ所定の要求を伝えるリバースイベントとにより、処理フローを構築する処理フロー構築部と、前記イベントおよび前記リバースイベントに応じて前記複数のノードそれぞれに定義された処理を実行する処理フロー実行部と、を有している。【選択図】図４
2018101176.tif 000002
【特許請求の範囲】
【請求項１】
それぞれに処理を規定したノード同士を、ある処理によって発生し他の処理に利用されるイベントで上流から下流に接続して処理フローを実現するイベントフローシステムであって、
複数のノードと、１つ以上のイベントと、下流ノードから該下流ノードよりも上流にある上流ノードへ所定の要求を伝えるリバースイベントとにより、処理フローを構築する処理フロー構築部と、
前記イベントおよび前記リバースイベントに応じて前記複数のノードそれぞれに定義された処理を実行する処理フロー実行部と、
を有するイベントフローシステム。
【請求項２】
前記リバースイベントは、前記下流ノードから前記上流ノードに対して、所定の処理の起動または停止に関する要求を伝達する、請求項１に記載のイベントフローシステム。
【請求項３】
前記リバースイベントは、前記上流ノードによるイベント発行の起動または停止に関する要求を伝達する、請求項２に記載のイベントフローシステム。
【請求項４】
前記リバースイベントは、イベント発行の起動を要求するメッセージである、請求項３に記載のイベントフローシステム。
【請求項５】
前記リバースイベントは、前記上流ノードで発生しキューに蓄積されたイベントの削除を要求するメッセージである、請求項３に記載のイベントフローシステム。
【請求項６】
前記リバースイベントは、前記上流ノードによるイベントの発行の締め切り時刻を設定するメッセージである、請求項３に記載のイベントフローシステム。
【請求項７】
前記処理フロー構築部は、前記イベントおよび前記リバースイベントを、前記ノード間を結ぶ線で表わす画面を表示する、請求項１に記載のイベントフローシステム。
【請求項８】
前記処理フロー構築部は、前記イベントと前記リバースイベントを視覚的に区別可能に表示する、請求項７に記載のイベントフローシステム。
【請求項９】
それぞれに処理を規定したノード同士を、ある処理によって発生し他の処理に利用されるイベントで上流から下流に接続して処理フローを実現するイベントフローシステムにおけるイベントフロー制御方法であって、
複数のノードと、１つ以上のイベントと、下流ノードから該下流ノードよりも上流にある上流ノードへ所定の要求を伝えるリバースイベントとにより、処理フローを構築し、
前記イベントおよび前記リバースイベントに応じて前記複数のノードそれぞれに定義された処理を実行する、
を有するイベントフロー制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
イベントに対する処理フローを構築し、実行するシステムに関する。
【背景技術】
【０００２】
対象システムに異常が発生したことを検知する異常監視システムでは、対象システムの現場に多数設置されたセンサから発行されるデータを所定の分析ロジックで分析することにより、異常を発見したり、異常の原因を推定したり、異常によるリスクを算定したりする。この種の異常監視システムでは、複数の分析ロジックを段階的に適用することにより、異常監視に所望の条件を設定することができる。段階的に実行される処理フローの例について説明する。
【０００３】
例えば、風力発電システムの現場に設置された小型マシンで構成されるエッジノードが風車に設置されたセンサで測定された振動量から１０分間の統計量を算出し、算出した統計量を１０分間統計情報として１０分間隔でデータセンタに送信する。データセンタにて１０分間統計情報を分析し、何らか風車の異常を検知すると、異常が検知された同一時間帯に当該風車の他の箇所に設置されたセンサで測定された振動やカメラで撮影された風車およびその周辺の映像の解析を行い、異常の原因を推定する。また、データセンタにて、１０分間統計情報から何らかの異常が検知されると、風車タワーの振動シミュレーションを多数実行し、タワーやブレードの破損リスクを算定する。
【０００４】
このような一連の処理フローを構築し、実行するソフトウェアエンジンが存在する。この種のソフトウェアエンジンには、処理フローをノードとイベントフローで定義するイベント駆動アーキテクチャを採用したものがある。イベント駆動アーキテクチャでは、イベントフローの上流ノードは下流ノードの構成や処理を意識せずに動作できるため、処理フローの構築が容易である。
【０００５】
しかしながら、イベント駆動アーキテクチャでは、上流ノードは下流ノードで利用されるか否かに関わらず所定の処理を実行して処理結果のデータを出力する。そのため、実際には下流ノードで使用されないデータを上流ノードで生成したり、使用されないデータを送信したりする無駄な処理が行われる。例えば、異常が検知されている時間は異常が検知されていない時間に比べて非常に短いが、異常が検知されていない間も、異常の原因を推定するための処理が継続的に実行されていたら、その処理は無駄な処理と言える。
【０００６】
これに対して、処理の無駄を低減する技術として特許文献１に記載された技術がある。並列シミュレーションにおいて、並列処理の途中で既に答えが見つかったため処理を収束させるとき、それ以降の余分なタスクをキャンセルし、処理の削減が行われる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００７−２４９９７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１に記載された技術は、処理を収束させるときにタスクをキャンセルする技術なので、上述したような下流で使用されないデータを生成するような無駄な処理を削減する用途には適さない。
【０００９】
また、コマンド駆動型フローを用いて、どのような条件に合致したときにどのような処理を実行するかを明示的に記述する処理フロー構築方法がある。しかし、この種の処理フロー構築方法では、本来の分析フロー以外の条件分岐処理が複雑化し、メンテナンス性が低下する。
【００１０】
本発明の目的は、処理フローを単純な構成に構築し、処理フローに含まれる無駄な処理の実行を削減することを可能にする技術を提供することである。
【課題を解決するための手段】
【００１１】
本発明の一つの実施態様に従うイベントフローシステムは、それぞれに処理を規定したノード同士を、ある処理によって発生し他の処理に利用されるイベントで上流から下流に接続して処理フローを実現するイベントフローシステムであって、複数のノードと、１つ以上のイベントと、下流ノードから該下流ノードよりも上流にある上流ノードへ所定の要求を伝えるリバースイベントとにより、処理フローを構築する処理フロー構築部と、前記イベントおよび前記リバースイベントに応じて前記複数のノードそれぞれに定義された処理を実行する処理フロー実行部と、を有している。
【発明の効果】
【００１２】
本発明によれば、リバースイベントにより下流ノードから上流ノードへ要求を送ることができるので、下流ノードの状態に基づいて上流ノードの動作を変化させて不要な処理を削減することができる。複雑な条件分岐のロジックを用いずに処理フローを構築し、かつ処理フローの実行において不要な処理を削減することができる。
【図面の簡単な説明】
【００１３】
【図１】本実施形態によるイベントフローシステムの概略ブロック図である。
【図２】イベントフローシステム１が構築し、実行する処理フローの一例を示す図である。
【図３】本実施例によるイベントフローシステムの全体構成を示すブロック図である。
【図４】本実施例によるイベントフローシステムの各ノードの構成を示すブロック図である。
【図５】セントラルノード１４が処理を実行する様子を説明するための図である。
【図６】処理フローの一例を示す図である。
【図７】図６の処理フローに対応するノードテーブルの一例を示す表である。
【図８】図６の処理フローに対応するフローテーブルの一例を示す表である。
【図９】フロービルダが実行する処理を示すフローチャートである。
【図１０】フロー実行部が処理フローを実行する様子を説明するための図である。
【図１１】図１０の処理フローの実行状態に対応するイベントキューの一例を示す表である。
【図１２】図１０の処理フローの実行状態に対応するリバースイベントキューの一例を示す表である。
【図１３】処理フローの実行によりノード間をイベントが流れる様子の一例を示すシーケンス図である。
【図１４】処理フローの実行によりノード間をイベントが流れる様子の他の例を示すシーケンス図である。
【図１５】イベントおよびリバースイベントの種類とその内容を示す図である。
【図１６】イベントソースの構成を示すブロック図である。
【図１７】イベントルータ５３の構成を示すブロック図である。
【図１８】イベントシンクの構成を示すブロック図である。
【図１９】イベント生成部が実行する処理を示すフローチャートである。
【図２０】イベント生成部が実行する処理を示すフローチャートである。
【図２１】イベント生成部が実行する処理を示すフローチャートである。
【図２２】イベントソースのリバースイベントハンドラが実行する処理を示すフローチャートである。
【図２３】リバースイベント生成部が実行する処理を示すフローチャートである。
【図２４】イベントハンドラが実行する処理を示すフローチャートである。
【図２５】イベントハンドラが実行する処理を示すフローチャートである。
【図２６】イベントハンドラが実行する処理を示すフローチャートである。
【図２７】イベントルータにおけるリバースイベント転送部が実行する処理を示すフローチャートである。
【図２８】処理フローにおけるリザーブのリバースイベントの処理のイメージを説明するための図である。
【図２９】図２８の処理フローにおけるある状態を示す図である。
【図３０】処理フローにおいてイベントおよびリバースイベントを処理する全体フローチャートである。
【図３１】リザーブのリバースイベントに関する処理を示すフローチャートである。
【図３２】確認解消処理のフローチャートである。
【図３３】リバースイベントを利用しない処理フローの一例を示す図である。
【図３４】リマインダのリバースイベントを利用した処理フローの一例を示す図である。
【図３５】キャンセルのリバースイベントを利用した処理フローの一例を示す図である。
【図３６】リザーブのリバースイベントを利用した処理フローの一例を示す図である。
【図３７】処理フロー作成時の画面表示の一例を示す図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施形態について図面を参照して説明する。
【００１５】
図１は、本実施形態によるイベントフローシステムの概略ブロック図である。図２は、イベントフローシステム１が構築し、実行する処理フローの一例を示す図である。
【００１６】
イベントフローシステム１は、それぞれに処理を規定したノード６同士を、ある処理によって発生し他の処理に利用されるイベント７で上流から下流に接続して処理フロー４を実現する。イベントフローシステム１は、複数のノード６のそれぞれに処理を定義し、複数のノード６およびノード６間を流れる１つ以上のイベント７により一連の処理フロー４を構築し、実行する。
【００１７】
処理フロー４には、常に必要とはされない一時利用処理５が含まれている。一時利用処理５を利用するときに起動したり、あるいは不要なときに停止したりすることが可能である。イベント７とは逆に下流のノード（下流ノード６ｂ）から上流のノード（上流ノード６ａ）へ所定の要求を伝えるリバースイベント８を用いて一時利用処理５の起動あるいは停止が実現される。
【００１８】
上流ノード６ａと下流ノード６ｂの関係は相対的であり、あるノード６を下流ノード６ｂとすると、それよりもイベント７の流れにおいて上流にあるノード６が上流ノード６ａとなる。ここで下流ノード６ｂと上流ノード６ａはイベント７で直接接続されていなくてもよく、それらの間に他のノード６があってもよい。
【００１９】
図１に示すように、イベントフローシステム１は処理フロー構築部２と処理フロー実行部３を有している。処理フロー構築部２は、図２に例示するように、複数のノード６と、１つ以上のイベント７と、下流ノード６ｂから上流ノード６ａへ所定の要求を伝えるリバースイベント８とにより、処理フロー４を構築する。処理フロー実行部３は、イベント７およびリバースイベント８に応じて、複数のノード６それぞれに定義された処理を実行していく。
【００２０】
以上説明したように、リバースイベント８により下流ノード６ｂから上流ノード６ａへ要求を送ることができるので、下流ノード６ｂの状態に基づいて上流ノード６ａの動作を変化させて不要な処理を削減することができる。複雑な条件分岐のロジックを用いずに処理フロー４を構築し、かつ処理フロー４の実行において不要な処理を削減することができる。
【００２１】
ここでは一例として、リバースイベント８は、下流ノード６ｂから上流ノード６ａに対して、所定の処理の起動または停止に関する要求を伝達するものである。下流ノード６ｂから上流ノード６ａの所定の処理の起動または停止ができるので、必要なときに処理を起動したり、あるいは不要なときに処理を停止したりすることができる。
【００２２】
さらには一例として、リバースイベント８は、上流ノード６ａによるイベント発行の起動または停止に関する要求を伝達するものである。上流ノード６ａのイベント発行の起動または停止ができるので、上流ノード６ａから下流ノード６ｂへのイベントを停止することができる。また、それにより下流ノード６ｂにおける無駄な処理を抑制することもできる。
【００２３】
以下、より具体的な実施例について説明する。
【００２４】
（実施例）
図３は、本実施例によるイベントフローシステムの全体構成を示すブロック図である。イベントフローシステム１は、クラウドシステム１１およびサイトシステム１９を有している。クラウドシステム１１とサイトシステム１９は携帯電話網１８で相互に接続されている。図中において、かっこで囲った数字は、それが添えられた対象部分の個数の例を表わしている。例えば、（１）は、対象部分が一例として１個であることを示している。（０．．）は対象部分が一例として０個以上であることを示している。
【００２５】
本イベントフローシステム１は、一例として監視制御システムであり、風力発電設備の監視および制御を行うシステムである。
【００２６】
クラウドシステム１１は、監視制御システムのデータセンタに配置される。サイトシステム１９は風力発電設備に含まれる各機器付近に配置される。
【００２７】
サイトシステム１９が各機器から取得したデータをクラウドシステム１１に送信される。クラウドシステム１１は各サイトシステム１９からのデータを受信し、蓄積する。また、クラウドシステム１１はデータを分析し、各機器の状態を推定するとともに、各機器に対して行う制御を決定する。各機器への制御の内容は制御指示としてサイトシステム１９に通知される。サイトシステム１９は通知される制御指示に従って機器への制御を行う。
【００２８】
１つのクラウドシステム１１に対してサイトシステム１９はいくつ接続されていてもよく、あるいはサイトシステム１９がなくてもイベントフローシステムとして機能することはできる。
【００２９】
クラウドシステム１１は、０個以上のアプリケーションノード１２、１個のセントラルノード１４、０個以上のマネージャＧＵＩ（Ｇｒａｐｈｉｃ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）１５、および０個以上のユーザＧＵＩ１６がＬＡＮ１７によって相互に接続された構成である。
【００３０】
アプリケーションノードはアプリケーション１３を実行する装置である。アプリケーション１３は例えば各機器から収集したデータを用いて様々な演算を行うアプリケーションプログラムである。
【００３１】
セントラルノード１４は、本イベントフローシステムの主要装置である。セントラルノード１４は、自装置を含む各ノードが実行すべき処理フローを構築する。各ノードが実行すべき処理フローは、それぞれを実行するノードに配信され、そこで実行される。セントラルノード１４自身も自身の実行すべき処理フローを実行する。
【００３２】
マネージャＧＵＩ１５は、本監視制御システムの管理者に管理者用ＧＵＩを提供する。
【００３３】
ユーザＧＵＩ１６は、本監視制御システムの利用者に利用者用ＧＵＩを提供する。
【００３４】
サイトシステム１９は、１つ以上のゲートウェイノード２０、１つ以上のセンサ２２、１つエッジノード２３、１つのエッジノード２４、および１以上のアクチュエータ２５がＬＡＮ／ＷＡＮ２１によって相互に接続されている。ＬＡＮ／ＷＡＮはＬＡＮまたはＷＡＭまたはそれらを複合した通信網である。
【００３５】
ゲートウェイノード２０は、クラウドシステム１１のセントラルノード１４と携帯電話網１８で接続し、メッセージおよびデータを含む情報を送受信する。
【００３６】
センサ２２は、機器あるいは機器周囲に配置され、機器あるいは機器周囲の状態を計測する各種センサである。
【００３７】
エッジノード２３は、センサ２２と接続し、センサ２２からの計測データを収集し、ゲートウェイノード２０を通じてセントラルノード１４に送信する。
【００３８】
エッジノード２４は、ゲートウェイノード２０を通じてセントラルノード１４からの制御指示を受信し、制御指示に従ってアクチュエータ２５を制御する。
【００３９】
アクチュエータ２５は、機器あるいは機器周囲に配置され、エッジノード２４により制御される可動部分である。
【００４０】
図４は、本実施例によるイベントフローシステムの各ノードの構成を示すブロック図である。
【００４１】
アプリケーションノード１２は、メモリ２６、ストレージ２７、ネットワークインタフェース（ＮＩＦ）２８、および中央処理装置（ＣＰＵ）２９を有している。メモリ２６には、フロー実行エンジンＦＥＥおよびノードライブラリＬＩＢが記憶されている。ストレージ２７には、フローテーブルＦＴ、ノードテーブルＮＴ、ノードパラメータＮＰが格納されている。
【００４２】
フローテーブルＦＴは、アプリケーションノード１２が実行する処理フローを定義する情報が格納されたテーブルである。ノードテーブルＮＴは処理フローに含まれるノードの情報が格納されたテーブルである。処理フロー内のノードはノードテーブルＮＴに定義される。ノードパラメータＮＰはノードにて利用される各種パラメータである。
【００４３】
フロー実行エンジン（処理フロー実行部）ＦＥＥは、セントラルノード１４のフロー構築エンジン（処理フロー構築部）ＦＢＥで構築された処理フローを実行するソフトウェアプログラムである。フロー実行エンジンＦＥＥは、ノードライブラリＬＩＢ内のファイルを適宜利用する。
【００４４】
ＣＰＵ２９は、メモリ２６上のフロー実行エンジンＦＥＥなどのソフトウェアプログラムを実行する。また、ＣＰＵ２９は、シミュレータ３０およびアプリケーション１３の実行、データベース３１の検索なども行う。
【００４５】
また、セントラルノード１４は、メモリ２６、ストレージ２７、ＮＩＦ２８、およびＣＰＵ２９を有している。メモリ２６には、フロー実行エンジンＦＥＥ、ノードライブラリＬＩＢ、およびフロー構築エンジンＦＢＥが記憶されている。ストレージ２７には、フローテーブルＦＴ、ノードテーブルＮＴ、ノードパラメータＮＰが格納されている。
【００４６】
フローテーブルＦＴは、セントラルノード１４が実行する処理フローを定義する情報が格納されたテーブルである。ノードテーブルＮＴは処理フローに含まれるノードの情報が格納されたテーブルである。処理フロー内のノードはノードテーブルＮＴに定義される。ノードパラメータＮＰはノードにて利用される各種パラメータである。
【００４７】
フロー構築エンジンＦＢＥは、本監視制御システム全体の処理フローを構築するソフトウェアプログラムである。フロー構築エンジンＦＥＢが構築する処理フローには、アプリケーションノード１２、セントラルノード１４、ゲートウェイノード２０、およびエッジノード２３、２４のそれぞれで実行すべき処理フローが含まれる。
【００４８】
フロー実行エンジンＦＥＥは、フロー構築エンジンＦＢＥで構築された処理フローを実行するソフトウェアプログラムである。フロー実行エンジンＦＥＥは、ノードライブラリＬＩＢ内のファイルを適宜利用する。
【００４９】
ＣＰＵ２９は、メモリ２６上のフロー構築エンジンＦＢＥやフロー実行エンジンＦＥＥなどのソフトウェアプログラムを実行する。ＣＰＵ２９は、マウス３２あるいはキーボード３３から入力される情報を処理に利用する。また、ＣＰＵ２９は、処理結果などをディスプレイ３４に表示する。
【００５０】
ゲートウェイノード２０は、メモリ２６、ストレージ２７、ＮＩＦ２８、およびＣＰＵ２９を有している。メモリ１２には、フロー実行エンジンＦＥＥおよびノードライブラリＬＩＢが記憶されている。ストレージ２７には、フローテーブルＦＴ、ノードテーブルＮＴ、ノードパラメータＮＰが格納されている。
【００５１】
フローテーブルＦＴは、ゲートウェイノード２０が実行する処理フローを定義する情報が格納されたテーブルである。ノードテーブルＮＴは処理フローに含まれるノードの情報が格納されたテーブルである。処理フロー内のノードはノードテーブルＮＴに定義される。ノードパラメータＮＰはノードにて利用される各種パラメータである。
【００５２】
フロー実行エンジンＦＥＥは、セントラルノード１４のフロー構築エンジンＦＢＥで構築された処理フローを実行するソフトウェアプログラムである。フロー実行エンジンＦＥＥは、ノードライブラリＬＩＢ内のファイルを適宜利用する。
【００５３】
ＣＰＵ２９は、メモリ２６上のフロー実行エンジンＦＥＥなどのソフトウェアプログラムを実行する。
【００５４】
エッジノード２３は、メモリ２６、ストレージ２７、ＮＩＦ２８、およびＣＰＵ２９を有している。メモリ１２には、フロー実行エンジンＦＥＥおよびノードライブラリＬＩＢが記憶されている。ストレージ２７には、フローテーブルＦＴ、ノードテーブルＮＴ、ノードパラメータＮＰが格納されている。
【００５５】
フローテーブルＦＴは、エッジノード２３が実行する処理フローを定義する情報が格納されたテーブルである。エッジノード２３の処理フローにはセンサ２２からの計測データを取得し、セントラルノード２０に通知する処理が含まれている。ノードテーブルＮＴは処理フローに含まれるノードの情報が格納されたテーブルである。処理フロー内のノードはノードテーブルＮＴに定義される。ノードパラメータＮＰはノードにて利用される各種パラメータである。
【００５６】
フロー実行エンジンＦＥＥは、セントラルノード１４のフロー構築エンジンＦＢＥで構築された処理フローを実行するソフトウェアプログラムである。フロー実行エンジンＦＥＥは、ノードライブラリＬＩＢ内のファイルを適宜利用する。
【００５７】
ＣＰＵ２９は、メモリ２６上のフロー実行エンジンＦＥＥなどのソフトウェアプログラムを実行する。
【００５８】
エッジノード２４は、メモリ２６、ストレージ２７、ＮＩＦ２８、およびＣＰＵ２９を有している。メモリ１２には、フロー実行エンジンＦＥＥおよびノードライブラリＬＩＢが記憶されている。ストレージ２７には、フローテーブルＦＴ、ノードテーブルＮＴ、ノードパラメータＮＰが格納されている。
【００５９】
フローテーブルＦＴは、エッジノード２４が実行する処理フローを定義する情報が格納されたテーブルである。エッジノード２４の処理フローにはアクチュエータ２５を制御する処理が含まれている。ノードテーブルＮＴは処理フローに含まれるノードの情報が格納されたテーブルである。処理フロー内のノードはノードテーブルＮＴに定義される。ノードパラメータＮＰはノードにて利用される各種パラメータである。
【００６０】
フロー実行エンジンＦＥＥは、セントラルノード１４のフロー構築エンジンＦＢＥで構築された処理フローを実行するソフトウェアプログラムである。フロー実行エンジンＦＥＥは、ノードライブラリＬＩＢ内のファイルを適宜利用する。
【００６１】
ＣＰＵ２９は、メモリ２６上のフロー実行エンジンＦＥＥなどのソフトウェアプログラムを実行する。
【００６２】
図５は、セントラルノード１４が処理を実行する様子を説明するための図である。セントラルノード１４は、処理フローを実行するフロー実行エンジンだけでなく、処理フローを構築するフロー構築エンジンを備えているので、各種ノードの代表として詳細に説明する。他の種類のノードにおけるフロー実行エンジンはセントラルノード１４のフロー実行エンジンと基本的な構成および動作が同様である。
【００６３】
セントラルノード１４は、フロー構築エンジン（ＦＢＥ）４９、フロー実行エンジン（ＦＥＥ）４１、ノードライブラリ（ＬＩＢ）５０、およびＮＩＦ２８を有している。セントラルノード１４は、シミュレータ、アナライザ、センサ、アクチュエータ、アプリケーションシステム、データベース、およびファイルシステムと連携して処理を実行する。
【００６４】
ＦＢＥ４９は、処理フローを構築するソフトウェアプログラムであり、フロービルダ５７を有している。フロービルダ５７は処理フローを構築する。処理フローの情報はフローテーブルＤ３およびノードテーブルＤ４に格納される。
【００６５】
ＦＥＥ４１は、処理フローを実行するソフトウェアプログラムであり、フロー実行部４２、ノード実行部４３、およびノードビルダ４８を有している。ノード実行部４３はイベントレシーバ４４、リバースイベントレシーバ４５、イベントセンダ４６、およびリバースイベントセンダ４７を有意している。
【００６６】
フロー実行部４２は、フローテーブルＤ３およびノードテーブルＤ４を参照し、ノード実行部４３と連携して、処理フローを実行する。
【００６７】
ノード実行部４３において、イベントレシーバ４４は、あるノード６が他のノード６からのイベント７を受信するための処理を行う。リバースイベントレシーバ４５は、あるノード６が他のノード６からのリバースイベント８を受信するための処理を行う。イベントセンダ４６は、あるノード６が他のノード６へイベント７を送信するための処理を行う。リバースイベントセンダ４７は、あるノード６が他のノード６へリバースイベント８を送信するための処理を行う。
【００６８】
ノードビルダ４８は、フロービルダ５７と連携してノード６を構築し、ノード６の情報をノードテーブルＤ４およびノードテーブルＤ５に格納する。
【００６９】
ＬＩＢ５０は、ノードに関するライブラリであり、ノードロジック５１を有している。ノードロジック５１はイベントソース５２、イベントルータ５３、およびイベントシンク５４を含んでいる。イベントソース５２は、他のノード６へのイベント７を生成するノードである。イベントルータ５３は、他のノード６からイベント６を受信するとともに、更に他のノード６にイベント７を送信するノードである。イベントシンク５４は、他のノード６からイベント７を受信するノード６である。
【００７０】
イベントソース５２、イベントルータ５３、およびイベントシンク５４は、ノードテーブルＤ５に基づいて処理内容が規定される。イベントソース５２、イベントルータ５３、およびイベントシンク５４はノードパラメータＤ６を参照して処理を実行する。
【００７１】
ＮＩＦ２８において、レシーバ５５は通信ネットワークからデータを受信し、センダ５６は通信ネットワークへデータを送信する。
【００７２】
図６は処理フローの一例を示す図である。図７は、図６の処理フローに対応するノードテーブルの一例を示す表である。図８は、図６の処理フローに対応するフローテーブルの一例を示す表である。
【００７３】
図６において、ノードＩはイベントソースであり、ノードＡ、Ｂ、Ｃ、およびＤはイベントルータであり、ノードＯはイベントシンクである。フロービルダ５７は、図６に示すような処理フローを構築する。
【００７４】
図６の処理フローにおいては、ノードＩからのイベントはノードＡに送られる。ノードＡからの一方のイベントはノードＢに送られ、他方のイベントはノードＣおよびノードＤに送られる。ノードＢからのイベントはノードＥに送られる。ノードＣからのイベントはノードＥに送られる。ノードＤからのイベントはノードＥに送られる。ノードＥからのイベントはノードＯに送られる。
【００７５】
図７には、図６の処理フローに用いられるノードの種類（Ｃｌａｓｓ）が定義されている。ノードの種類として、ＣｌａｓｓＩ、Ａ、Ｂ、Ｃ、Ｄ、Ｅ、およびＯがある。例えば、ＣｌａｓｓＩは、入力ポート数（ＩＮ  ｐｏｒｔ  ｎｕｍｂｅｒ）が０であり、出力ポート数（ＯＵＴ  ｐｏｒｔ  ｎｕｍｂｅｒ）が１であり、コスト（Ｃｏｓｔ）が１０である。ノードテーブルＤ４のコストは、予め定められた、そのノードの処理に要する時間あるいは処理量を示す。このコストはノードの種類によって定まる論理的な数値である。
【００７６】
図８には、図６の処理フローに用いられるノードとイベントの情報が記述されている。各ノードの種類（Ｃｌａｓｓ）、入力ポートの接続先（Ｉ０、Ｉ１・・・Ｉｎ）、出力ポートの接続先（Ｏ０、Ｏ１、・・・Ｏｎ）、およびコスト（Ｃｏｓｔ）が記載されている。例えば、ノードＩは、種類がＣｌａｓｓＩであり、出力ポートＯ０がＡ＃Ｉ０に接続されており、コストが１１である。Ａ＃Ｉ０はノードＡの入力ポートＩ０を表わしている。フローテーブルＤ３のコストは、実際に処理の実行したときの処理に要した時間あるいは処理量を示す。このコストは実際に処理を実行したときの測定値である。
【００７７】
図９は、フロービルダが実行する処理を示すフローチャートである。
【００７８】
フロービルダ５７は、ステップＳ１０１にてユーザからの操作入力を受信すると、ステップＳ１０２にて、その操作入力がノードの追加を要求するものか否か判定する。操作入力がノード追加の要求でなければ、フロービルダ５７は、ステップＳ１０３にて、その操作入力がノードの削除を要求するものか否か判定する。
【００７９】
操作入力がノード削除の要求でなければ、フロービルダ５７は、ステップＳ１０４にて、その操作入力がリンクの追加を要求するものか否か判定する。リンクとは、イベントあるいはリバースイベントを示すノード間の接続である。操作入力がリンク追加の要求でなければ、フロービルダ５７は、ステップＳ１０５にて、その操作入力がリンクの削除を要求するものか否か判定する。
【００８０】
操作入力がリンク削除の要求でなければ、フロービルダ５７は、ステップＳ１０６にて、その操作入力がノードパラメータの更新を要求するものか否か判定する。操作入力がノードパラメータ更新の要求でなければ、フロービルダ５７は、ステップＳ１０７にて、その操作入力が終了を要求するものか否か判定する。操作入力が終了の要求でなければ、フロービルダ５７は、ステップＳ１０１に戻る。操作入力が終了の要求であれば、フロービルダ５７は処理を終了する。
【００８１】
ステップＳ１０２において操作入力がノード追加の要求であれば、フロービルダ５７は、ステップＳ１０８にて、フローテーブルＤ３に、追加が要求されたノードの列を追加する。ステップＳ１０３において操作入力がノード削除の要求であれば、フロービルダ５７は、ステップＳ１０９にて、フローテーブルＤ３から、削除が要求されたノードの列を削除する。更に、フロービルダ５７は、ステップＳ１１０にて、フローテーブルの他の列を探索し、関連するノードへのリンクを削除する。
【００８２】
ステップＳ１０４において操作入力がリンク追加の要求であれば、フロービルダ５７は、ステップＳ１１１にて、フローテーブルＤ３に、追加が要求されたリンクの接続元となるノードにリンク情報（接続先の情報）を追加する。更に、フロービルダ５７は、ステップＳ１１２にて、追加が要求されたリンクの接続先となるノードにリンク情報（接続元の情報）を追加する。
【００８３】
ステップＳ１０５における操作入力がリンク削除の要求であれば、フロービルダ５７は、ステップＳ１１３にて、フローテーブルＤ３から、削除が要求されたリンクの接続元の情報を削除する。更に、フロービルダ５７は、ステップＳ１１４にて、フローテーブルＤ３から、削除が要求されたリンクの接続先の情報を削除する。
【００８４】
ステップＳ１０６における操作入力がノードパラメータ更新の要求であれば、フロービルダ５７は、ステップＳ１１５にて、フローテーブルＤ３における、要求されたノードのパラメータ更新を行う。
【００８５】
図１０は、フロー実行部が処理フローを実行する様子を説明するための図である。図１１は、図１０の処理フローの実行状態に対応するイベントキューの一例を示す表である。図１２は、図１０の処理フローの実行状態に対応するリバースイベントキューの一例を示す表である。
【００８６】
イベントキューＤ１には、イベントの送信元（ＦＲＯＭ）と、送信先（ＴＯ）と、イベント名（ＥＶＥＮＴ）と、処理期限までの残り時間（Ｌｉｍｉｔ）が示されている。Ｌｉｍｉｔの欄の値は時間経過とともにカウントダウンされる。例えば、Ｌｉｍｉｔの単位が［分］であるとすると、イベントｅ１は、Ｌｉｍｉｔが１０なので、１０分までに処理する必要がある。リバースイベントキューＤ２に記載される項目はイベントキューＤ１と同様である。
【００８７】
フロー実行部４２は、図５に示したように、受信したイベントをイベントキューＤ１に蓄積し、必要があれば、受信したリバースイベントをリバースイベントキューＤ２に蓄積し、イベントキューＤ１からイベントを呼び出し、必要があれば、リバースイベントキューＤ２からリバースイベントを呼び出し、所定の処理を実行する。フロー実行部４２は、処理結果を、必要があれば、イベントあるいはリバースイベントあるいはその両方として、送信する。
【００８８】
図１０において、白抜き楕円はイベントキューＤ１に蓄積されたイベントを示し、白抜き楕円内にはイベント名が示されている。また、黒塗り楕円はリバースイベントキューＤ２に蓄積されたリバースイベントを示し、黒塗り楕円にはリバースイベント名が示されている。
【００８９】
図１０を参照すると、例えば、ノードＩからノードＡへのイベントを示すリンクの近傍に、イベントｅ１の白抜き楕円が示されている。図１１を参照すると、１列目のイベントｅ１は、送信元がノードＩの出力ポートＯ０であり、送信先がノードＡの入力ポートＩ０である。そして、イベントｅ１は上述のように１０分後までに処理する必要がある。
【００９０】
また、図１０を参照すると、例えば、ノードＥからノードＯへのイベントを示すリンクの近傍に、リバースイベントｒ１の黒塗り楕円が示されている。図１２を参照すると、１列目のリバースイベントｒ１は、送信元がノードＯの入力ポートＩ０であり、送信先がノードＥの出力ポートＯ０である。そして、リバースイベントｒ１も１０分後までに処理する必要がある。
【００９１】
図１３は、処理フローの実行によりノード間をイベントが流れる様子の一例を示すシーケンス図である。図１３の例では、ノードＡからノードＣにイベントｅ１が送信され、ノードＢからノードＣにイベントｅ２が送信されている。ノードＣは、イベントｅ１とイベントｅ２を受信してイベントｅ３をノードＤに送信している。
【００９２】
図１４は、処理フローの実行によりノード間をイベントが流れる様子の他の例を示すシーケンス図である。図１４の例では、ノードＥからノードＧにイベントｅ４が送信され、ノードＦからノードＧにイベントｅ６が送信されている。ノードＧは、ノードＥからイベントｅ４を受信すると、ノードＨにイベントｅ５を送信し、イベントｅ６を受信するとイベントｅ７をノードＨに送信している。
【００９３】
図１５は、イベントおよびリバースイベントの種類とその内容を示す図である。イベントの情報には、その内容として、種別１（ＴＹＰＥ１）、種別２（ＴＹＰＥ２）、センサＩＤ（ＳＩＤ）、時間範囲（ＴｉｍｅＲａｎｇｅ）が含まれている。種別１は大きな種別を示し、種別２は詳細な種別を示す。センサＩＤは、イベントに関連する計測データを測定するセンサの識別情報である。時間範囲は、例えば１日分のように、ある時間範囲についての情報の場合にその時間範囲を示す。
【００９４】
イベントにはイベント（ノーマルイベント）とリバースイベントがある。そのイベントがノーマルイベントであるかリバースイベントであるかは種別１により示される。
【００９５】
ノーマルイベントには、有効（Ｖａｌｉｄ）なイベントと、無効（ｉｎｖａｌｉｄ）なイベントがある。そのイベントが有効か無効かは種別２により示される。有効なイベントにはデータＴ［Ｖ］が含まれていてもよい。
【００９６】
リバースイベントには、リマインダ（Ｒｅｍｉｎｄｅｒ）と、キャンセル（Ｃａｎｃｅｌ）と、リザーブ（Ｒｅｓｅｒｖｅ）がある。そのリバースイベントがリマインダかキャンセルかリザーブかは種別２により示される。
【００９７】
リマインダはイベント発行の起動を要求するメッセージである。リマインダのメッセージを利用することにより、通常時にはイベントの発行を停止しておき、必要になったらイベントの発行を起動することができる。無駄なイベントの発行を抑制することができる。
【００９８】
キャンセルは上流ノードで発生しキューに蓄積されたイベントの削除を要求するメッセージである。キャンセルのメッセージを利用することにより、蓄積されたデータをキャンセルすることができるので、無駄な非同期イベントの発行につながるデータを削除し、非同期イベントの処理負荷を低減することができる。
【００９９】
リザーブは、上流ノードによるイベントの発行の締め切り時刻を設定するメッセージである。リザーブには、イベントの発行の締め切り時刻（Ｌｉｍｉｔ）が含まれる。リザーブのメッセージを利用することにより、緊急度の低いイベントにいつまでに発行すればよいという期限を設定することにより、上流ノードが緊急度の高い処理を優先させることを可能にし、処理負荷を時間的に分散させることができる。
【０１００】
図１６は、イベントソースの構成を示すブロック図である。イベントソース５２はデータキュー６１、リバースイベントハンドラ６２、およびイベント生成部６３を有している。
【０１０１】
センサ２２あるいはレシーバ５５から入力したデータはデータキュー６１に一次蓄積される。イベント生成部６３は、所定のタイミングでデータキュー６１からデータを取り出し、処理してイベントを生成してイベントセンダ４６に送る。データを即時に処理するイベントソース５２の場合、イベント生成部６３は、データキュー６１にデータが格納されたことを契機に処理を開始する。データを蓄積して処理するイベントソース５２の場合、イベント生成部６３は、例えば一定時間間隔でデータキュー６１からデータを取り出して処理する。リバースイベントハンドラ６２は、リバースイベントレシーバ４５からリバースイベントを受信すると、そのリバースイベントの要求に従って動作する。イベント生成部６３およびリバースイベントハンドラ６２は、ファイルシステム６４およびデータベース３１のデータを適宜参照し、処理に利用する。
【０１０２】
リバースイベントがリマインダの場合、リバースイベントハンドラ６２は、データキュー６１を読み出し可能にし、停止していたイベントの発行を起動する。リバースイベントがキャンセルの場合、リバースイベントハンドラ６２は、データキュー６１に蓄積されたデータを破棄する。リバースイベントがリザーブの場合、リバースイベントハンドラ６２は、データキュー６１に蓄積されたデータに基づくイベントの送信の期限（締め切り時刻）を設定する。
【０１０３】
図１７は、イベントルータ５３の構成を示すブロック図である。イベントルータ５３はリバースイベント転送部６５、リバースイベント生成部６６、リバースイベントハンドラ６７、およびイベントハンドラ６８を有している。
【０１０４】
イベントハンドラ６８は、イベントレシーバ４４から入力したイベントを処理し、イベントを生成してイベントセンダ４６に送る。リバースイベント生成部６６は、イベントレシーバ４４から入力したイベントに基づき、リバースイベントを生成してリバースイベントセンダ４７に送る。
【０１０５】
リバースイベントレシーバ４５から入力したリバースイベントが、本イベントルータ５３で処理すべきものである場合、そのリバースイベントはリバースイベントハンドラ６７に送られる。リバースイベントハンドラ６７は、受信したリバースイベントを処理し、リバースイベントの要求に従って動作する。
【０１０６】
リバースイベントがリマインダの場合、リバースイベントハンドラ６７は、停止していたイベントの発行を起動する。リバースイベントがキャンセルの場合、リバースイベントハンドラ６７は、不図示のデータキューに蓄積されたデータを破棄する。リバースイベントがリザーブの場合、リバースイベントハンドラ６７は、不図示のデータキューに蓄積されたデータに基づくイベントの送信の期限（締め切り時刻）を設定する。
【０１０７】
リバースイベントレシーバ４５から入力したリバースイベントが、本イベントルータ５３で処理すべきものでない場合、そのリバースイベントは、リバースイベント転送部６５により、リバースイベントセンダ４７に送られる。
【０１０８】
イベントハンドラ６８およびリバースイベントハンドラ６７は、シミュレーションを実行するシミュレータ３０、あるいはデータを分析するアナライザ６９を適宜、処理に利用する。また、イベントルータ５３は、トランザクション７０、フィルタ７１、あるいはスイッチ７２と適宜連携する。
【０１０９】
図１８は、イベントシンクの構成を示すブロック図である。イベントシンク５４はリバースイベント生成部７３およびイベントハンドラ７４を有している。
【０１１０】
イベントレシーバ４４から入力したイベントはリバースイベント生成部７３にて受信される。リバースイベント生成部７３は、受信したイベントを処理し、必要に応じてリバースイベントを生成してリバースイベントセンダ４７に送る。また、リバースイベント生成部７３は、受信したイベントをイベントハンドラ７４に送る。イベントハンドラ７４は、イベントに対して所定の処理を行う。イベントハンドラ７４は、データベース３１、ファイルシステム６４、アクチュエータ２５、アプリケーションシステム７５、センダ５６と適宜連携する。例えば、イベントハンドラ７４は、アプリケーションシステム７５のアプリケーションプログラムに従って、データベース３１およびファイルシステム６４から所定のデータを取得し、そのデータを利用してイベントを処理し、アクチュエータ２５を制御し、センダ５６を介してデータを送信する。
【０１１１】
図１９、図２０、図２１はイベント生成部が実行する処理を示すフローチャートである。
【０１１２】
図１９には、センサ２２から計測データを受信したときのイベント生成部６３の処理が示されている。図１９を参照すると、イベント生成部６３は、ステップＳ２０１にて、センサ２２から計測データを受信すると、ステップＳ２０２にて有効なイベントを発行する（ステップＳ２０２）。
【０１１３】
図２０には、データベース３１から取得したデータのイベントを発行するときのイベント生成部６３の処理が示されている。図２０を参照すると、イベント生成部６３は、まずデータベース３１に対して所望のクエリを発行し、イベントで通知すべきデータを抽出する。続いて、イベント生成部６３は、抽出したデータの全ての列について（ステップＳ３０２）、有効なイベントを発行する（ステップＳ３０３）。抽出した全てのデータについてイベントの発行が終了すると（ステップＳ３０４）、イベント生成部６３は処理を終了する。
【０１１４】
図２１には、レシーバ５５から受信したデータのイベントを発行するときのイベント生成部６３の処理が示されている。図２１を参照すると、イベント生成部６３は、ステップＳ４０１にて、レシーバ５５からデータを受信する。続いて、イベント生成部６３は、受信したデータの全ての列について（ステップＳ４０２）、有効なイベントを発行する（ステップＳ４０３）。受信した全てのデータについてイベントの発行が終了すると（ステップＳ４０４）、イベント生成部６３は次のデータの受信を待ち受ける。
【０１１５】
図２２は、イベントソースのリバースイベントハンドラが実行する処理を示すフローチャートである。イベントソース５２におけるリバースイベントハンドラ６２は、ステップＳ５０１にて、対象のリバースイベントの種別２がリマインダであるか否か判定する。リバースイベントがリマインダでなければリバースイベントハンドラ６２は処理を終了する。リバースイベントがリマインダであれば、リバースイベントハンドラ６２は、ステップＳ５０２にて、イベントで送信すべきデータをポーリングし、ステップＳ５０３にて、送信すべきデータの有無を判定する。データが存在していれば、リバースイベントハンドラ６２は、ステップＳ５０４にて、そのデータに基づく有効なイベントを発行する。データが存在していなければ、リバースイベントハンドラ６２は処理を終了する。
【０１１６】
図２３は、リバースイベント生成部が実行する処理を示すフローチャートである。イベントルータ５３にはリバースイベント生成部６６があり、イベントシンク５４にはリバースイベント生成部７３がある。図２３に示す処理はそれらに共通する処理である。ここではリバースイベント生成部６６を例として説明する。
【０１１７】
まず、リバースイベント生成部６６は、ステップＳ６０１にて、入力したイベントが無効か否か判定する。イベントが無効であれば、リバースイベント生成部６６は、無効なイベントが許容されるか否か判定する。無効なイベントが許容されない場合、リバースイベント生成部６６は、全ての出力ポートについて無効なイベントを発行する（ステップＳ６０３~Ｓ６０５）。更に、リバースイベント生成部６６は、全ての入力ポートについてキャンセルのリバースイベントを発行して（ステップＳ６０６~Ｓ６０８）、処理を終了する。
【０１１８】
ステップＳ６０１にてイベントが有効であった場合、あるいはステップＳ６０２にて無効なイベントが許容されるものであった場合、リバースイベント生成部６６は、ステップＳ６０９にて、タイムスタンプが更新されているか否か判定する。タイムスタンプが更新されていれば、リバースイベント生成部６６は、他の全ての入力ポートについて到着したイベントを破棄する（ステップＳ６１４~Ｓ６１６）。
【０１１９】
ステップＳ６０９にてタイムスタンプが更新されていない場合、あるいはステップＳ６１６で全てのイベントを破棄し終えた場合、リバースイベント生成部６６は、ステップＳ６１０にて、全ての入力ポートにイベントが到着しているか否か判定する。全ての入力ポートにイベントが到着していれば、リバースイベント生成部６６は、ステップＳ６１７にて、それらのイベントの処理をイベントハンドラ６８に依頼し、処理を終了する。
【０１２０】
一方、ステップＳ６１０にて全ての入力ポートにイベントが到着していなければ、リバースイベント生成部６６は、残りの全ての入力ポートについてリマインダのリバースイベントを発行し（ステップＳ６１１~Ｓ６１３）、処理を終了する。
【０１２１】
図２４、図２５、図２６は、イベントハンドラが実行する処理を示すフローチャートである。イベントハンドラには、図１７に示したイベントルータ５３のイベントハンドラ６８と、図１８に示したイベントシンク５４のイベントハンドラ７４がある。それらの動作は基本的に同様である。ここではイベントハンドラ６８を例として説明する。
【０１２２】
図２４には、トランザクション処理におけるイベントハンドラの動作が示されている。まず、イベントハンドラ６８は、所定の論理演算処理を実行し（ステップＳ７０１）、有効なイベントを生成する（ステップＳ７０２）。続いて、イベントハンドラ６８は、有効なイベントを発行する（ステップＳ７０３）。
【０１２３】
図２５には、フィルタ処理を含むイベントハンドラの動作が示されている。まず、イベントハンドラ６８は、所定の論理演算処理を実行し（ステップＳ８０１）、処理後に所定の条件が満たされているか否か判定する（ステップＳ８０２）。続いて、イベントハンドラ６８は、条件が満たされていれば有効なイベントを発行し（ステップＳ８０３）、条件が満たされていなければ無効なイベントを発行する（ステップＳ８０４）。
【０１２４】
図２６には、スイッチ処理を含むイベントハンドラの動作が示されている。まず、イベントハンドラ６８は、所定の論理演算処理を実行する（ステップＳ９０１）。続いて、イベントハンドラ６８は、複数の条件について以下のループ処理を繰り返す（ステップＳ９０２〜ステップＳ９０６）。
【０１２５】
ループ処理において、イベントハンドラ６８は、まず、その条件が満たれているか否か判定し（ステップＳ９０３）、条件が満たされていれば有効なイベントを発行し（ステップＳ９０４）、条件が満たされていなければ無効なイベントを発行する（ステップＳ９０５）。
【０１２６】
図２７は、イベントルータにおけるリバースイベント転送部が実行する処理を示すフローチャートである。イベントルータ５３にリバースイベントが適用されると、リバースイベント転送部６５は、リバースイベントハンドラ６７にてリバースイベントが処理された後、あるいはリバースイベントがイベントルータ５３の処理対象でない場合、全ての入力ポートに対して以下のループ処理を実行する（ステップＳ１００２〜ステップＳ１００４）。ループ処理においては、リバースイベント転送部６５は、入力ポートからリバースイベントを発行する（ステップＳ１００３）。これによりリバースイベントは必要に応じて上流のノードに伝達される。
【０１２７】
図２８は、処理フローにおけるリザーブのリバースイベントの処理のイメージを説明するための図である。図２９は、図２８の処理フローにおけるある状態を示す図である。図２９を参照すると、処理フロー４は、ノードＩからのイベントがノードＡに送られ、ノードＡからのイベントがノードＢに送られ、ノードＢからのイベントがノードＯに送られるという構成である。ノードＩからノードＡに向けたイベントｅ５が示されている。また、ノードＡからノードＩに向けたリバースイベントｒ１と、ノードＢからノードＡに向けたリバースイベントｒ２と、ノードＯからノードＢに向けたリバースイベントｒ４が示されている。
【０１２８】
図２８には、左側にイベントキューＤ１の遷移の様子が示され、右側にリバースイベントキューＤ２の遷移の様子が示されている。
【０１２９】
状態ＲＳ１０１では、リバースイベントキューＤ２にノードＯからノードＢに向かうリザーブのリバースイベントｒ４が存在している。リバースイベントｒ４は、ノードＢにおける処理期限までの残り時間（Ｌｉｍｉｔ）が１００であることを示している。そのリザーブのリバースイベントｒ４は上流に展開される。リバースイベントｒ４が展開された状態ＲＳ１０２では、リバースイベントｒ４が、ノードＡのＬｉｍｉｔが９８であることを示すリバースイベントｒ２と、ノードＩのＬｉｍｉｔが９６であることを示すリバースイベントｒ１と、ノードＡへの入力のＬｉｍｉｔが９４であることを示すリバースイベントｒ０に展開されている。各Ｌｉｍｉｔの値は、ノードをさかのぼる毎にそのノードのコストを減算して算出される。図２８の例は、ノードＢ、ノードＡ、およびノードＩのコストが２であるとして算出されている。
【０１３０】
一方、イベントキューＤ１には、状態ＥＳ１０１では、ノードＩからノードＡに向かうイベントｅ５が存在する。次の状態ＥＳ１０２では、イベントキューＤ１に、ノードＩからノードＡに向かうイベントｅ１が追加されている。ここでは、イベントｅ１は、リバースイベントｒ１とＳＩＤが一致したとする。リバースイベントｒ１はイベントｅ１のＬｉｍｉｔを指定するものなので、イベントｅ１は、締め切りが修正され、Ｌｉｍｉｔがリバースイベントｒ１と同じ９６になっている。
【０１３１】
その状態ＥＳ１０２からＬｉｍｉｔが小さい順（昇順）にイベントが処理される。まずイベントｅ５が処理される。イベントｅ５はノードＡにより転送され、ノードＡからノードＢに向かうイベントとなり、新たにＬｉｍｉｔが１０と設定されている。その間に、イベントｅ１はＬｉｍｉｔが時間経過の分の１０だけカウントダウンされ、状態ＥＳ１０３には、８６となっている。
【０１３２】
さらに、状態ＥＳ１０３から、Ｌｉｍｉｔが小さいイベントｅ５が処理される。イベントｅ５がノードＢで処理されることにより、状態ＥＳ１０４には、新たにノードＢからノードＯに向かうイベントＥ１００が発生している。新たに追加されるイベントＥ１００のＬｉｍｉｔは１０である。イベントｅ１のＬｉｍｉｔはカウントダウンされて６となっている。
【０１３３】
状態ＥＳ１０４から、Ｌｉｍｉｔの小さいイベントｅ１がノードＡにより処理されることにより、状態ＥＳ１０５には、ノードＡからノードＢに向かう新たなイベントｅ２が発行されている。新たなイベントｅ２のＬｉｍｉｔは１０である。
【０１３４】
その間に、リバースイベントキューＤ２は状態ＲＳ１０３になっているとする。ここで、イベントｅ２と、リバースイベントｒ２のＳＩＤが一致したとする。リバースイベントｒ２はイベントｅ１のＬｉｍｉｔを指定するものであるので、状態ＥＳ１０６には、イベントｅ２のＬｉｍｉｔがリバースイベントｒ２と同じ８に修正されている。
【０１３５】
図３０は、処理フローにおいてイベントおよびリバースイベントを処理する全体フローチャートである。ただし、リザーブのリバースイベントに関する処理については別途説明する。
【０１３６】
フロー実行部４２は、イベントソースを起動し（ステップＳ１１０１）、イベントソースからのイベントをイベントキューＤ１に追加し（ステップＳ１１０２）、イベントレシーバ４４からのイベントをイベントキューＤ１へあるいはリバースイベントレシーバ４５からのリバースイベントをリバースイベントキューＤ２に追加する（ステップＳ１１０３）。
【０１３７】
続いて、フロー実行部４２は、確認解消処理を実行する（ステップＳ１１０４）。確認解消処理は、互いに合致するリバースイベントとイベントを整理する処理である。確認解消処理の詳細は後述する。
【０１３８】
続いて、フロー実行部４２は、イベントキューＤ１が空か否か判定する（ステップＳ１１０５）。イベントキューＤ１が空でなければ、フロー実行部４２は、イベントキューＤ１から１つのイベントを取得し（ステップＳ１１０９）、そのイベントの処理を適用する（ステップＳ１１１０）。
【０１３９】
ステップＳ１１０５にてイベントキューＤ１が空であった場合、あるいはステップＳ１１１０の後、フロー実行部４２は、リバースイベントキューＤ２が空か否か判定する（ステップＳ１１０６）。リバースイベントキューＤ２が空でなければ、フロー実行部４２は、リバースイベントキューＤ２から１つのリバースイベントを取得し（ステップＳ１１１１）、そのリバースイベントの処理を適用する（ステップＳ１１１２）。
【０１４０】
ステップＳ１１０６にてリバースイベントキューＤ２が空であった場合、あるいはステップＳ１１１２の後、フロー実行部４２は、イベントキューＤ１およびリバースイベントキューＤ２が空であるか否か判定する（ステップＳ１１０７）。イベントキューＤ１およびリバースイベントキューＤ２が空であればフロー処理部４２は処理を終了する。イベントキューＤ１とリバースイベントキューＤ２のいずれか一方あるいは両方が空でなければフロー処理部４２はステップＳ１１０５に戻る。
【０１４１】
図３１は、リザーブのリバースイベントに関する処理を示すフローチャートである。図３１の処理は例えば図３０の処理の前あるいは後に実行することにしてもよい。
【０１４２】
フロー処理部４２は、イベントソースを起動した後（ステップＳ１２０１）、停止が要求されるまでループ処理を実行する（ステップＳ１２０２~Ｓ１２０３）
ループ処理において、フロー処理部４２は、イベントソースからのイベントをイベントキューＤ１に追加し（ステップＳ１２０４）、イベントレシーバ４４からのイベントをイベントキューＤ１へあるいはリバースイベントレシーバ４５からのリバースイベントをリバースイベントキューＤ２に追加する（ステップＳ１２０５）。
【０１４３】
次に、フロー処理部４２は、リザーブのリバースイベントが受信されているか否か判定する（ステップＳ１２０６）。リザーブのリバースイベントがあれば、フロー処理部４２は、図２８にて説明したように、リバースイベントをコストに基づいて展開する（ステップＳ１２１６）。
【０１４４】
ステップＳ１２０６にてリザーブのリバースイベントを受信していない場合、あるいはステップＳ１２１７の後、フロー処理部４２は、イベントキューＤ１が空であるか否か判定する（ステップＳ１２０７）。イベントキューＤ１が空でなければ、Ｌｉｍｉｔが最も小さい行のイベントをイベントキューＤ１から取り出し（ステップＳ１２１７）、そのイベントの処理を適用する（ステップＳ１２１８）。
【０１４５】
次に、フロー処理部４２は、Ｌｉｍｉｔを前回計算しなおしてからの経過時間を取得する（ステップＳ１２０８）。フロー処理部４２は、リバースイベントキューＤ２の全ての行におけるＬｉｍｉｔをステップＳ１２０９で取得した経過時間だけ減算する（ステップＳ１２１０~Ｓ１２１２）。また。また、フロー処理部４２は、イベントキューＤ１の全ての行におけるＬｉｍｉｔをステップＳ１２０９で取得した経過時間だけ減算する（ステップＳ１２１３~Ｓ１２１５）。
【０１４６】
図３２は、確認解消処理のフローチャートである。フロー処理部４２は、イベントキューＤ１内の全てのイベントを順次対象として、以下に説明するループ処理を実行する（ステップＳ１３０１~Ｓ１３０３）。
【０１４７】
ループ処理において、フロー処理部４２は、まずイベント一致判定処理を行う（ステップＳ１３０２）。イベント一致判定処理は、リバースイベントとイベントとのマッチングの有無を判定する処理である。
【０１４８】
イベント一致判定処理に置いて、フロー処理部４２は、対象となっているイベントとＳＩＤが一致するリバースイベントがあるか否か判定する（ステップＳ１３０９）。イベントとＳＩＤが一致するリバースイベントがあったら、フロー処理部４２は、そのイベントとリバースイベントのT
ｉｍｅＲａｎｇｅが一致するか否か判定する（ステップＳ１３１０）。ＴｉｍｅＲａｎｇｅが一致したらマッチングがとれた（Ｔ：Ｔｒｕｅ）と判定される。
【０１４９】
ステップＳ１３０９にてイベントとＳＩＤが一致するリバースイベントが無かった場合、ステップＳ１３１０にてＴｉｍｅＲａｎｇｅが一致しなかった場合、マッチングがとれなかった（Ｆ：ｆａｌｓｅ）と判定される。マッチングが取れなかった場合、フロー処理部４２は、イベントキューＤ１内の全てのイベントについてループ処理が完了したか否か判定する（ステップＳ１３０３）。フロー処理部４２は、ループ処理が完了していたら確認解消処理を終了し、ループ処理が完了していなければステップＳ１３０１に戻る。
【０１５０】
ステップＳ１３０２にてマッチングがとれた場合、フロー処理部４２は、そのリバースイベントがリマインダであるか否か判定する（ステップＳ１３０４）。リバースイベントがリマインダであれば、フロー処理部４２は、そのリバースイベントを破棄し（ステップＳ１３０５）、ステップＳ１３０３に進む。そのリバースイベントにより起動すべきイベントの発行が既にされているからである。
【０１５１】
ステップＳ１３０４にてリバースイベントがリマインダでなければ、フロー処理部４２は、リバースイベントがキャンセルであるか否か判定する（ステップＳ１３０６）。リバースイベントがキャンセルであれば、フロー処理部４２は、そのリバースイベントを破棄し（ステップＳ１３０７）、更にそのイベントを破棄する（ステップＳ１３０８）。リバースイベントとそれによりキャンセルされるイベントが共に破棄される。
【０１５２】
ステップＳ１３０５あるいはステップＳ１３０８の後、フロー処理部４２はステップＳ１３０３に進む。
【０１５３】
図３３は、リバースイベントを利用しない処理フローの一例を示す図である。図３３には、コマンド駆動型の処理フローが示されている。「Ｉｆ  Ｖ＞１０」の条件が満たされたときに「Ｐｕｌｌ  Ｓｅｎｓｏｒ」が駆動される。センサーに不要な処理を行わせないようにするために、システムが本来行うべき主機能以外の条件分岐が複雑となっている。その結果メンテナンス性の低下につながる。また、処理フローが単一の目的に調整されたものとなるので処理フローを他の目的に転用するのが難しくなる。
【０１５４】
本実施形態によるリバースイベントを利用した処理フローは様々な処理フローが考えられる。
【０１５５】
図３４は、リマインダのリバースイベントを利用した処理フローの一例を示す図である。図３４の「Ｐｕｌｌ  Ｓｅｎｓｏｒ」は通常はイベントを発行しておらず、要求されたときにのみイベントを発行するイベントソースである。「Ｃａｌｃ２」は複数の入力ポートからのイベントが全て揃うまで待機し、揃ったら、それらのイベントを時刻で結合して下流へイベントを発行するイベントルータである。「Ｃａｌｃ２」は、「Ｆｉｌｔｅｒ  Ｖ＞１０」から有効なイベントが入力したとき、「Ｃａｌｃ４」からイベントが入力していないので、リマインダを送ってイベントの発行を「Ｃａｌｃ４」へ要求する。「Ｃａｌｃ２」は「Ｃａｌｃ４」からのイベントを受信すると、下流の「Ｃａｌｃ３」へ有効なイベントを発行する。「Ｃａｌｃ３」も「Ｃａｌｃ２」と同様に複数の入力ポートからのイベントが全て揃うまで待機し、揃ったら、それらのイベントを時刻で結合して下流のへイベントを発行するイベントルータである。「Ｃａｌｃ３」は、「Ｃａｌｃ２」から有効なイベントが入力したとき、「Ｃａｌｃ５」からイベントが入力していないので、リマインダを送ってイベントの発行を「Ｃａｌｃ５」へ要求する。「Ｃａｌｃ３」は「Ｃａｌｃ５」からのイベントを受信すると、下流の「Ｏｕｔｐｕｔ」へ有効なイベントを発行する。
【０１５６】
このように、「Ｆｉｌｔｅｒ  Ｖ＞１０」で条件満たされると、「Ｃａｌｃ２」からリマインダのリバースイベントが送信される。イベントの発行を停止していた上側の「Ｐｕｌｌ  Ｓｅｎｓｏｒ」と「Ｃａｌｃ４」がリマインダを受信してイベントの発行を開始する。また、「Ｆｉｌｔｅｒ  Ｖ＞１０」で条件満たされると、「Ｃａｌｃ３」からリマインダのリバースイベントが送信される。イベントの発行を停止していた下側の「Ｐｕｌｌ  Ｓｅｎｓｏｒ」と「Ｃａｌｃ４」がリマインダを受信してイベントの発行を開始する。「Ｃａｌｃ１」からのイベントが多くの場合に「Ｆｉｌｔｅｒ  Ｖ＞１０」の条件を満たさないようなものであれば、「Ｃａｌｃ４」および「Ｃａｌｃ５」での不要な処理を効果的に削減することができる。
【０１５７】
例えば、全てのセンサからの計測値に異常が発見されたときにだけ、異常が発見られたセンサの近傍のセンサにイベントの発行を依頼するという態様が考えられる。
【０１５８】
例えば、風力発電設備の風車のブレードに５４本のボルトが用いられており、各ボルトそれぞれに対して状態を計測するセンサが設けられているとする。いずれかのボルトに対応するセンサの計測値から異常が発見されたとき、そのボルトの近傍の４本のボルトについてのみ応力を算出するというような処理フローが考えられる。
【０１５９】
図３５は、キャンセルのリバースイベントを利用した処理フローの一例を示す図である。
【０１６０】
図３４の処理フローでは、不要な処理を省くことができるが、必要が生じてからイベントの発行を要求するので、レイテンシは大きくなる。それに対して、図３５の処理フローでは、「Ｆｉｌｔｅｒ  Ｖ＞１０」は条件が満たされないときには、下流に無効なイベントを発行するものとする。「Ｃａｌｃ２」は、無効なイベントを受信すると、キャンセルのリバースイベントを発行するものとする。キャンセルのリバースイベントによりイベントキューにあるイベントが破棄され、それより下流に流れなくなる。また、計算中、通信中、あるいは観測中など処理中のイベントはその処理が取り消される。また、「Ｃａｌｃ２」は、無効なイベントを受信すると、下流の「Ｃａｌｃ３」へ無効なイベントを発行するものとする。「Ｃａｌｃ３」も無効なイベントを受信すると、キャンセルのリバースイベントを発行するものとする。
【０１６１】
「Ｆｉｌｔｅｒ  Ｖ＞１０」は条件が満たされたときには、下流に有効なイベントを発行する。そうすると、「Ｃａｌｃ２」がキャンセルのリバースイベントを発行しなくなるので、イベントキュー内のイベントは発行され、「Ｃａｌｃ２」に送られる。「Ｃａｌｃ３」もキャンセルのリバースイベントを発行しなくなるので、イベントキュー内のイベントは発行され、「Ｏｕｔｐｕｔ」に送られる。
【０１６２】
このように、不要なイベントをイベントキューにて破棄することができるので、その下流における不要な処理を効果的に削減することができる。また、必要が生じたら、イベントキュー内のイベントが発行され始めるので、レイテンシが小さくなる。
【０１６３】
図３６は、リザーブのリバースイベントを利用した処理フローの一例を示す図である。例えば風車の近傍にある「Ｅｄｇｅ  Ｍａｃｈｉｎｅ」設けられた「Ｃａｌｃ２」は、風車の振動量のデータを送信する。「Ａｇｇｒｅｇａｔｅ  １０ｍｉｎ」は、１０分間分の振動量のデータを用いて、平均値などの統計量を算出する。「Ａｇｇｒｅｇａｔｅ  １０ｍｉｎ」は、統計量を算出するタイミングで１０分間の分のデータが揃っていれば良いので、リザーブのリバースイベントを発行し、上流の「Ｃａｌｃ２」に処理期限を設定する。「Ｃａｌｃ２」は、期限の迫っているイベントを優先的に発行し、期限が遅いイベントの発行や処理を遅らせるというように、処理リソースを有効に利用することが可能となる。
【０１６４】
図３７は、処理フロー作成時の画面表示の一例を示す図である。フロービルダ（処理フロー構築部）５７は、イベントおよびリバースイベントを、ノード間を結ぶ線で表わした画面を表示する。これにより、ユーザによるイベントフローの構築を支援することができる。また、フロービルダ５７は、イベントとリバースイベントを視覚的に区別可能に表示する。図３７では、イベントを実線矢印で表わし、リバースイベントを破線矢印で表わしている。ただし、視覚的区別方法はこれに限定されず、色分け、線の太さによる区別など、他の方法でもよい。ユーザによりイベントフロー構築の作業がやり易くなる。
【０１６５】
上述した本発明の実施形態は、本発明の説明のための例示であり、本発明の範囲をそれらの実施形態にのみ限定する趣旨ではない。当業者は、本発明の要旨を逸脱することなしに、他の様々な態様で本発明を実施することができる。
【符号の説明】
【０１６６】
１…イベントフローシステム、１１…クラウドシステム、１２…アプリケーションノード、１３…アプリケーション、１４…セントラルノード、１５…マネージャＧＵＩ、１６…ユーザＧＵＩ、１７…ＬＡＮ、１８…携帯電話網、１９…サイトシステム、２…処理フロー構築部、２０…ゲートウェイノード、２０…セントラルノード、２１…ＷＡＮ、２２…センサ、２３…エッジノード、２４…エッジノード、２５…アクチュエータ、２６…メモリ、２７…ストレージ、２８…ＮＩＦ（ネットワークインタフェース）、２９…ＣＰＵ、３…処理フロー実行部、３０…シミュレータ、３１…データベース、３２…マウス、３３…キーボード、３４…ディスプレイ、４…処理フロー、４１…ＦＥＥ（フロー実行エンジン）、４２…フロー実行部、４２…フロー処理部、４３…ノード実行部、４４…イベントレシーバ、４５…リバースイベントレシーバ、４６…イベントセンダ、４７…リバースイベントセンダ、４８…ノードビルダ、４９…ＦＢＥ（フロー構築エンジン）、５０…ＬＩＢ（ノードライブラリ）、５１…ノードロジック、５２…イベントソース、５３…イベントルータ、５４…イベントシンク、５５…レシーバ、５６…センダ、５７…フロービルダ、６…ノード、６１…データキュー、６２…リバースイベントハンドラ、６３…イベント生成部、６４…ファイルシステム、６５…リバースイベント転送部、６６…リバースイベント生成部、６７…リバースイベントハンドラ、６８…イベントハンドラ、６９…アナライザ、６ａ…上流ノード、６ｂ…下流ノード、７…イベント、７０…トランザクション、７１…フィルタ、７２…スイッチ、７３…リバースイベント生成部、７４…イベントハンドラ、７５…アプリケーションシステム、８…リバースイベント
【図１】
2018101176.tif 000003
【図２】
2018101176.tif 000004
【図３】
2018101176.tif 000005
【図４】
2018101176.tif 000006
【図５】
2018101176.tif 000007
【図６】
2018101176.tif 000008
【図７】
2018101176.tif 000009
【図８】
2018101176.tif 000010
【図９】
2018101176.tif 000011
【図１０】
2018101176.tif 000012
【図１１】
2018101176.tif 000013
【図１２】
2018101176.tif 000014
【図１３】
2018101176.tif 000015
【図１４】
2018101176.tif 000016
【図１５】
2018101176.tif 000017
【図１６】
2018101176.tif 000018
【図１７】
2018101176.tif 000019
【図１８】
2018101176.tif 000020
【図１９】
2018101176.tif 000021
【図２０】
2018101176.tif 000022
【図２１】
2018101176.tif 000023
【図２２】
2018101176.tif 000024
【図２３】
2018101176.tif 000025
【図２４】
2018101176.tif 000026
【図２５】
2018101176.tif 000027
【図２６】
2018101176.tif 000028
【図２７】
2018101176.tif 000029
【図２８】
2018101176.tif 000030
【図２９】
2018101176.tif 000031
【図３０】
2018101176.tif 000032
【図３１】
2018101176.tif 000033
【図３２】
2018101176.tif 000034
【図３３】
2018101176.tif 000035
【図３４】
2018101176.tif 000036
【図３５】
2018101176.tif 000037
【図３６】
2018101176.tif 000038
【図３７】
2018101176.tif 000039