(58)【調査した分野】(Int.Cl.,DB名)
前記分散データグリッドは、イベント・ディスパッチャ処理にイベントをポストすることによって、前記イベント・ディスパッチャと、前記イベント・ディスパッチャによってディスパッチされるイベントをハンドリングするサービス・スレッドとの間で、イベント処理の継続性をサポートする、請求項1から3のいずれかに記載のシステム。
前記分散データグリッドに関連付けられるレジストリをさらに備え、前記1つ以上のイベント・インターセプタは前記レジストリに登録される、請求項1〜5のいずれかに記載のシステム。
エンドユーザがイベントをハンドリングするためにカスタマイズされたロジックを実装することを可能にするインターフェイスをさらに備える、請求項1〜7のいずれかに記載のシステム。
前記イベント・ディスパッチャは、前記1つ以上のイベント・インターセプタを、それらが登録されているイベントに対してトリガする、請求項1〜8のいずれかに記載のシステム。
前記1つ以上のイベント・インターセプタは、それらが前記イベント・ディスパッチャにマッピングされる順序で実行される、請求項1〜9のいずれかに記載のシステム。
前記分散データグリッド内のパーティションサービスに関連付けられたサービス・スレッドは、すべての受信要求をハンドリングし、かつそれらの実行を調整する役割を果たす、請求項1〜10のいずれかに記載のシステム。
【発明を実施するための形態】
【0009】
詳細な説明
さまざまな実施形態に従い、サーバ側イベントモデルには、分散データグリッド内で、クラスタ全体にわたって分散されたデータパーティションを格納する複数のクラスタノードが提供され得、各クラスタノードは1組のパーティションを担当する。1つの例示的な分散データグリッドは、オラクル(登録商標)社のCoherenceデータグリッドである。このシステムは、1つ以上のイベント・インターセプタを、クラスタ内に配置されたイベント・ディスパッチャにマッピングし得る。1つ以上のイベント・インターセプタは、イベント・ディスパッチャからディスパッチされる少なくとも1つのイベントをハンドリングすることができ、少なくとも1つのイベントは分散データグリッド内のオペレーションに関連付けられている。このシステムは、上記1つ以上のイベント・インターセプタによる少なくとも1つのイベントのハンドリングが完了するまで、分散データグリッド内のオペレーションの完了を遅らせ得る。
【0010】
ある実施形態に従い、分散データグリッド内のサーバ側機能を実行するクリティカルパスにイベントが発生し得る。データグリッドは、ある一定のデータが変更されたときにのみ受動的な演算を実行し得る。データグリッドは、クライアントをクリティカルパスに注入することを回避するために、クライアント側からのインタラクションを必要とせずにそのようなイベントのハンドリングをサポートする。データグリッド内では、クライアントがクリティカルパスに関与するとクライアント応答を待つための不要な遅延が生じ得るため、クライアントがクリティカルパスに関与できないようにすることが好ましい。
【0011】
ある実施形態に従い、クリティカルパス内のイベントのハンドリングは、クライアント・インタラクションのオーバーヘッドなしにデータグリッドが大きなデータ列を処理するときに有益であり得る。こうして、データグリッドはより多くのタイプのイベントを使用し得、イベントをハンドリングするための異なるイベント・リスナーまたはインターセプタを定義し得る。さらに、データグリッド内のデータに対するオペレーションの実行は、クリティカルパス内にディスパッチされるイベントのハンドリングが完了するまで遅らされる。こうして、必要とされるサーバ側イベントは、分散データグリッドの性能を改良し得る。
サーバ側イベントモデル
【0012】
ある実施形態に従い、Coherenceの単一イベントモデル(Unified Event Model:UEM)などのサーバ側イベントモデルは、分散データグリッド内のサーバ側プログラミングモデルを単純化するために用いられ得る汎用イベント・フレームワークである。
【0013】
サーバ側イベントモデルは、一貫性があるセマンティックモデル、一様な構成を提供し得、分散データグリッドのサーバ側プログラミング能力を拡張するための柔軟性を拡大し得る。イベントは、対応するイベントハンドラの内部からどのオペレーションが実行され得るかを形式化する、明確に定義されたセマンティクスを有し得る。これらのイベントは、分散データグリッド・クラスタ内で拡張性に対して「ワンストップ・ショップ(one-stop shopping)」を提供し得る。ユーザはどのイベントが利用可能であるかを迅速に調べ、それらのセマンティクスを理解し得る。
【0014】
サーバ側イベントモデルを用いて、分散データグリッドは、広範な拡張可能なフックの代わりにサーバ側プログラミングモデルを提供し得る。たとえば、Coherenceでは、エンドユーザはこのサーバ側プログラミングモデルを用いて、バッキング・マップ・リスナー(Backing Map Listener)、パーティション・リスナー(Partition Listener)、キャッシュ・ローダー/キャッシュ・ストア(Cache Loader/Cache Store)、トリガ(Trigger)、トランスフォーマ(Transformer)、エントリ・プロセッサ(Entry Processor)、アグリゲータ(Aggregator)およびカスタム・バッキング・マップ(Custom Backing Map)のためのカスタムロジックを挿入し得る。こうして、分散データグリッドは、拡張可能なフックの使用に関する異なる問題を回避し得、外部ユーザアプリケーションとのデータ交換を単純化し得る。
【0015】
図1は、本発明の実施形態に係る、サーバ側イベントモデルをサポートする分散データグリッドを示す図である。
図1に示されるように、サーバ側イベントモデル110は、相互接続された複数のクラスタノード101〜106を含むデータグリッド・クラスタ100内に設けられ得る。サーバ側イベントモデルは、1つ以上のイベント・インターセプタ121〜123にマッピングされ得る少なくとも1つのイベント・ディスパッチャ111を含む。イベント・インターセプタは、サーバ側イベントモデル・フレームワークによって発生したイベント120を受信してハンドリングする役割を果たす。データグリッド・クラスタ内に配置されるイベント・ディスパッチャは、イベント・インターセプタを、イベント・インターセプタが登録されているイベントに対してトリガする役割を果たし得る。
【0016】
ある実施形態に従い、イベント・インターセプタは、サーバ側イベントモデル・フレームワークによって発生したイベントを受信してハンドリングする役割を果たし得る。イベント・インターセプタはさらに、2つ以上のイベント・インターセプタが同じイベントに登録されている場合、ともにチェーンされ得る。こうして、複数のインターセプタが単一のイベントのコンテキスト内で実行され得る。
【0017】
Coherenceの例では、イベント・インターセプタ・インターフェイスは、イベントをハンドリングするためのロジックを実装するためにエンドユーザに提供され得る。リスティング1において以下に示されるようなサンプルインターフェイスは、イベントをハンドリングするための1つの方法および登録処理の一部として用いられる別の方法の、2つの方法を有し得る。
【数1】
【0018】
ある実施形態に従い、イベント・ディスパッチャは、イベントが発生する必要のあるコンテキストに緊密に結合され得る専用オブジェクトである。分散データグリッド内のキーの場所に配置された専用イベント・ディスパッチャ・インスタンスが存在し得る。
【0019】
Coherenceでは、イベント・ディスパッチャは、StorageEventをハンドリングするためのPartitionedServiceに関連付けられ得る。リスティング2において以下に示されるように、最適化されたイベント・インターセプタの登録を容易にするために、イベント・ディスパッチャは、イベント・ディスパッチャがディスパッチする役割を果たす明確に定義された1組のイベントを有し得る。
【数2】
【0020】
さらに、イベント・ディスパッチャは、たとえばJMXを介して自身の性能についての統計を公開し、サーバ側イベントモデルがシステム内でどのように挙動しているかについての見通しを開発者およびオペレーションチームの両方に与え得る。そのような情報には、すべての登録されたイベント・インターセプタの名前、登録された各イベント・インターセプタの対象のイベント・タイプ、発生/処理されたイベントの数、投げられた例外の数、イベントのハンドリングに費やされる平均時間、イベントのハンドリングに費やされる最長時間、上記イベントの間に最も長く時間がかかったイベント・インターセプタの名前が含まれる。
【0021】
図2は、本発明の実施形態に係る、分散データグリッド内のサーバ側イベントモデルを提供するためのフローチャートを示す図である。
図2に示されるように、ステップ201において、1つ以上のイベント・インターセプタがイベント・ディスパッチャにマッピングされ得る。イベント・ディスパッチャは、分散データグリッド内のオペレーションに関連付けられる少なくとも1つのイベントをディスパッチするように動作する。次に、ステップ202において、上記1つ以上のイベント・インターセプタは、イベント・ディスパッチャから上記1つ以上のイベント・インターセプタにディスパッチされる少なくとも1つのイベントをハンドリングし得る。最後に、ステップ203において、分散データグリッドは、上記1つ以上のイベント・インターセプタによる少なくとも1つのイベントのハンドリングが完了するまで、オペレーションの完了を遅らせる。
イベント階層
【0022】
ある実施形態に従い、イベントは、分散データグリッド内で実行される何らかのオペレーションの観察可能な発生を表わす。分散データグリッド内には異なるタイプのイベントが存在し得る。たとえば、クライアント・イベントはクライアント・コンテキスト(すなわち非ストレージ・メンバー)内で発生し得、ストレージ・イベントはストレージ可能メンバーのコンテキスト内で発生し得る。
【0023】
ある実施形態に従い、イベントは、イベントが発生する機能領域に対応する1組のインターフェイスと定義され得る。
【0024】
図3は、本発明の実施形態に係る、分散データグリッド内のサーバ側イベントモデルのイベント階層を示す図である。
図3に示されるように、Eventインターフェイス301はシステム内のすべてのイベントのベースである。システム内の各イベントオブジェクトは、自身に関連付けられた1つ以上のイベント・タイプを有し得る。Eventインスタンスのコンシューマは、イベント・タイプに基づいてどの動作を実行すべきかを決定し得る。以下のリスティング3は、CoherenceにおけるサンプルのEventインターフェイスを示す。
【数3】
【0025】
さらに
図3に示すように、イベント階層300は、ストレージ・イベントのためのStorageEventインターフェイス302を含む。StorageEventインターフェイスは、イベント・インターフェイスから直接的に拡張する。さらに、イベント階層は、異なるタイプのストレージ・イベントのための、StorageCacheEventインターフェイス303、StorageEntryEventインターフェイス304、StorageInvocationEventインターフェイス305、およびStorateTransferEventインターフェイス306を含む。
【0026】
さらに、
図3には示されない他のイベントも存在し得る。たとえば、クラスタ内のメンバーシップ(参加したメンバー、離脱したメンバー)に関するイベントであるMemberEvent、クラスタ全体に関するイベントであるClusterEvent、Coherenceトランザクション(開始、コミット、ロードバック)に関するイベントであるTransactionEvent、Coherence Proxy(ロード・バランシング・イベント、プッシュバック・イベント)に関するイベントであるProxyEvent、セキュリティおよび監査に関するイベントであるSecurityEvent、動作を必要とするいくつかの閾値エラーが発生したことを示すイベントであるAbnormalEvent、ならびにストレージ不可能メンバー上で実行されるイベントであるClientSideEventが存在し得る。
【0027】
ある実施形態に従い、イベント・インスタンスは不変であり得、その寿命は下層システムによって制御され得る。したがって、イベント・クラスの参照は、複数の呼出しにわたって保持され得ない。
イベントのディスパッチ
【0028】
ある実施形態に従い、イベントのディスパッチには、イベント・インターセプタによる処理のためのイベントの発生と、同じイベントに登録されたイベント・インターセプタが2つ以上ある場合のイベント・インターセプタのチェーンの呼出しとが含まれる。
【0029】
ある実施形態に従い、イベント・インターセプタはともにチェーンされ得、イベントをディスパッチする役割を果たすスレッドによって逐次呼出され得る。イベントオブジェクトのベース実装は、インターセプタをチェーンするためのすべてのロジックを提供し得、これは次に、指定インターフェイスによって必要とされるイベント・インスタンスの各実装に再使用され得る。イベント・インターセプタは、イベント・インターセプタがイベント・ディスパッチャに追加された順序に基づいて実行され得る。たとえば、Coherenceでは、イベント・インターセプタは、EventDispatcher.addInterceptor()方法で第1のパラメータを介して先頭または末尾に追加され得る。
【0030】
図4は、本発明の実施形態に係る、分散データグリッド内のサーバ側イベントモデルについてイベントをディスパッチするフローを示す図である。
図4に示されるように、イベントをディスパッチするフローは401で開始され、402において、処理するためのイベントが発生する。イベントをディスパッチするフローは、403において、イベントに登録されたイベント・インターセプタのチェーンを呼出すステップを含む。チェーン内のイベント・インターセプタがシステムによってトリガされると、404において、イベントをハンドリングするためにonEvent()方法が実行され得る。最後に、イベントをディスパッチするフローは、406において、チェーン内のすべてのイベント・インターセプタが呼出されて完了すると終了する。
【0031】
チェーン内の各イベント・インターセプタは、コンテキストが許可する場合、イベントに関連付けられたデータを任意に修正し得る(たとえばStorageEntryEvent前のINSERTINGおよびUPDATINGイベント)。予めコミットされたストレージ・イベント(たとえばUPDATING、INSERTING、REMOVING)については、イベント・インターセプタは、405において例外を投げることによってオペレーションを禁止し得る。
【0032】
チェーン内の各イベント・インターセプタは、チェーン内で自身の後に実行されるイベント・インターセプタによって生じるすべての副作用の結果を任意に観察し得る。インターセプタ・チェーンが予めコミットされたストレージ・イベントに関連付けられている場合、この結果観察能力は、処理を禁止する第2の機会を提供する。
【0033】
下流のイベント・インターセプタの副作用の観察は、Event.nextInterceptor()方法によって達成され得る。この方法がリターン(return)すると、すべての下流のイベント・インターセプタが実行されたことを意味し、イベントに関連付けられた状態に対するいずれの変更も観察可能である。
【0034】
ある実施形態に従い、イベントオブジェクトは、下流の効果の観察をサポートするために、イベント・インスタンスの処理の状態を保持し得る。イベント・インターセプタ自身がEvent.nextInterceptor()を呼出すと、イベント・インターセプタは発火すべきチェーン内の次のイベント・インターセプタをトリガし得、例外を投げることを含む、副作用に対して行動を取るオプションが与えられる。イベント・インターセプタがリターン(return)すると、イベント自身がチェーンのonEvent()方法において次のイベント・インターセプタをトリガし得る。
インターセプタ管理
【0035】
ある実施形態に従い、イベント・インターセプタは、システム内のどのイベント・ディスパッチャが利用可能であるかを直接的に知らずに、サーバ側イベントモデル・フレームワークに登録され得る。たとえば、システムは、まだインスタンス化されていないイベント・ディスパッチャにイベント・インターセプタが登録されるシナリオをサポートし得る。ユーザが、ensureCache(“cache-foo”)が呼出される前に特定のサービスについてのすべてのストレージ・イベントに関心がある場合、登録されたイベント・インターセプタは、“cache-foo”についてのイベント・ディスパッチャが実現される際にこのディスパッチャに依然として追加される必要があり得る。さらに、システムは、イベント・インターセプタをイベント・ディスパッチャに選択的に登録し得る。また、ディスパッチャの選択基準はイベント・ディスパッチャおよびディスパッチャ実装ごとに異なり得るため、システムは柔軟なカスタマイズ化可能なマッピングをサポートし得る。
【0036】
ある実施形態に従い、イベント・インターセプタ・レジストリは、システムに登録されたイベント・インターセプタを、システムに登録されたイベント・ディスパッチャにマッピングし得る。イベント・インターセプタ・レジストリは、イベント・ディスパッチャの後のランタイム初期化およびランタイム・イベント・インターセプタ登録をサポートするために、利用可能なイベント・ディスパッチャおよび現在登録されているイベント・インターセプタの両方を追跡し得る。以下のリスティング4は、イベント・インターセプタ・レジストリのサンプルインターフェイスである。
【数4】
【0037】
サーバ側イベントモデル・フレームワークは、イベント・インターセプタを異なるイベント・ディスパッチャに柔軟に整合させ得る。フレームワークは、イベント・ディスパッチャが所与のイベント・インターセプタを呼出すべきか否かを判断するために、イベント・インターセプタとイベント・ディスパッチャとの間のハンドシェイクを可能にする。このハンドシェイクは登録期間中に行なわれ得る。
【0038】
ある実施形態に従い、登録ワークフローは、ディスパッチャの登録およびインターセプタの登録と同様である。主な相違点は、レジストリが登録された1組のインターセプタまたは登録された1組のイベント・ディスパッチャ全体にわたって反復しているか否かである。
【0039】
図5は、ある実施形態に係る、分散データグリッド内のイベント・インターセプタの登録を示す図である。
図5に示されるように、502において新たなインターセプタがイベント・インターセプタ・レジストリに登録されると、504においてレジストリは登録された各ディスパッチャについてinterceptor.introduceDispatcher(Dispatcher d)を呼出す。そして、イベント・インターセプタは、供給されたディスパッチャからのイベントを自身がリスニングしたいか否かを評価し得る。リスニングしたい場合、506において、インターセプタはEventDispatcher.addInterceptor()を呼出すことによって自身をディスパッチャに関連付け得る。
【0040】
図6は、ある実施形態に係る、分散データグリッド内のイベント・インターセプタの登録を示す図である。
図6に示されるように、602において新たなディスパッチャが登録されると、604においてレジストリは登録された各インターセプタについてinterceptor.introduceDispatcher(Dispatcher d)を呼出す。そして、イベント・インターセプタは、供給されたディスパッチャからのイベントを自身がリスニングしたいか否かを評価し得る。リスニングしたい場合、606において、インターセプタはEventDispatcher.addInterceptor()を呼出すことによって自身をディスパッチャに関連付け得る。
【0041】
サーバ側イベントのプログラム構成をサポートするために、イベント・インターセプタ・レジストリ・インスタンスは、JVM内で実行されるCoherenceインスタンス全体に利用可能であるようにされ得る。システム内のどこからもレジストリにアクセスできるため、サーバ側イベントモデルは、ディスパッチャおよびインターセプタがインスタンス化される際にそれらを動的に追加および削除することをサポートするのに十分拡張可能であり得る。Coherenceでは、異なる機能性はregisterResource/unregisterResource APIを介してクラスタに追加され得る。レジストリは、いずれかの他のオブジェクトまたはコンポーネントがレジストリへのアクセスを望む前に、インスタンス化されてクラスタオブジェクトに登録され得る。たとえば、インターセプタ・レジストリは、com.oracle.EventInterceptorRegistryの名前で格納され得る。
Coherenceにおけるサポートクラス
【0042】
ある実施形態に従い、分散データグリッドは、サーバ側イベントモデルのシンプルなユースケースについて、すぐに使えるサポートクラスを提供し得る。たとえば、Coherenceデータグリッドは、抽象イベント・インターセプタ・クラス、シンプルなデリゲート・イベント・インターセプタ・クラス、シンプルなイベント・ディスパッチャ・クラス、およびマルチスレッド・イベント・ディスパッチャ・クラスを提供する。
【0043】
抽象イベント・インターセプタ・クラスは、システム内のインターセプタを構築するのに必要な作業を単純化するイベント・インターセプタのためのベース実装を提供し得る。抽象イベント・インターセプタ・クラスは、イベント・タイプと、サービス名と、処理されるイベントの総数、イベントの平均処理時間、およびイベントの最長処理時間を含む基本的なJMXメトリクスとに基づいて、基本的な登録アルゴリズムを提供し得る。
【0044】
シンプルなデリゲート・イベント・インターセプタ・クラスは、サポートされるイベント・タイプのみに集中することによって、システム内のイベント・インターセプタの登録の際に必要なオーバーヘッドを減少させ得る。シンプルなデリゲート・イベント・インターセプタ・クラスは、抽象イベント・インターセプタ・クラスを拡張し得、イベント・インターセプタと、イベント・インターセプタがリスニングする関心がある任意のサービス名と、イベント・インターセプタがリスニングする関心がある任意のキャッシュ名と、上記インターセプタがリスニングする関心がある1組のイベント・タイプとを用いて構築され得る。
【0045】
ある実施形態に従い、次にイベント・ディスパッチャは、供給されたインターセプタを所望のイベント・タイプに整合させ得、インプリメンタはシステム内のイベント・ディスパッチャとのハンドシェイクのいずれにも対処する必要がない。
【0046】
シンプルなイベント・ディスパッチャ・クラスは、1組のインターセプタおよびそれらの順序をタイプによって管理する役割を果たし得る汎用イベント・ディスパッチャである。新たなインターセプタを追加するとインターセプタ・リストの新たなコピーが生成され得るため、現在処理中のどのイベントにも処理の最中に影響が及ばない。さらに、コンポーネントがイベント・タイプをディスパッチしたい場合、シンプルなイベント・ディスパッチャは、適切な1組のインターセプタを取り、インターセプタ・チェーニングフローに基づいてイベントにそれらの処理を開始するよう頼む役割を果たし得る。また、シンプルなイベント・ディスパッチャは、実行順序における名前による登録済インターセプタのリスト、ディスパッチされたイベントの数、イベントのディスパッチに費やされる平均時間、イベントをディスパッチする最長時間、および最長ディスパッチ時間を有するインターセプタなどのJMX統計について報告する役割を果たし得る。さらに、シンプルなイベント・ディスパッチャ・クラスは、DispatchEventの汎用実装とともにEventDispatcherインターフェイスを実装するcom.tangosol.net.internal.unifiedevents.dispatchersの下で実装され得る。
【0047】
また、マルチスレッド・イベント・ディスパッチャ・クラスはシンプルなイベント・ディスパッチャ・クラスを拡張し得、余分のスレッドを追加してイベントを非同期に処理し得る。イベントは、内部ワーカー・スレッドによる処理のためにキューに配置され得る。メイン・スレッドがキューに作業を配置する間、ワーカー・スレッドは登録されたインターセプタを実際に呼出す役割を果たす。マルチスレッド・イベント・ディスパッチャは、メイン・スレッドについてのイベントのディスパッチ、およびワーカー・スレッドについてのイベントのディスパッチの両方を可能にするAPIを提供し得る。
サーバ側イベントモデルの構成
【0048】
ある実施形態に従い、サーバ側イベントモデルはプログラム的に構成され得る。たとえば、Coherenceでは、イベント・インターセプタ・レジストリは、Cluster.getResource(“com.oracle.EventInterceptorRegistry”)を呼出すことによってクラスタから抽出され得る。さらに、イベント・インターセプタは、EventInterceptorRegistry.registerInterceptor(“InterceptorName”、新たなEventInterceptor())を呼出すことによってイベント・インターセプタ・レジストリに登録され得る。
【0049】
別の実施形態に従い、サーバ側イベントモデルは、キャッシュ構成ファイル内で宣言的に構成され得る。以下のリスティング6は、インターセプタ構成を有するサンプルキャッシュ構成である。
【数5】
【0050】
上記に示されるように、Coherenceの名前空間ハンドラは、キャッシュ構成ファイル内の新たなxml要素をサポートするように拡張され得る。1つのxml要素は、システム内に登録される1組のすべてのインターセプタを定義する任意の<event-interceptors>要素であり得る。別のxml要素は、イベント・インターセプタのインスタンスを定義する任意の<interceptor>要素であり得る。
【0051】
<interceptor>要素は、インターセプタの名前を定義する<name>属性と、EventInterceptorを実装するクラスの名前を定義する<class-scheme>属性と、<service-name>、<cache-name>、および<events>に関連付けられているいずれかのディスパッチャをインターセプタがフィルタリングするかの宣言的な方法を定義する<dispatcher-filter>属性とを含み得る。<service-name>属性は、登録するために整合する必要のあるサービスの名前を定義する。<cache-name>属性は、登録するために整合する必要のあるキャッシュの名前を定義する。<events>属性は、インターセプタが登録することを望むイベントのリストを定義する。<event-type>属性は、登録すべきイベント・インスタンスを定義する。<event-type>属性は、<class-scheme>属性および<events>属性に対して登録すべきイベント・インスタンスを定義する。<class-scheme>属性は、com.tangosol.coherence.unifiedevents.StorageEntryEventなどの使用すべきサーバ側イベント・クラスを定義し、<events>属性は、登録すべきイベント名のリストを定義する。
オフロードイベントおよびサポート継続
【0052】
ある実施形態に従い、エンドユーザコードがクラスタ・メンバーを停止させたりストールすることを防止するために、サーバ側イベントモデルは、可能ならいつでも、分散データグリッド内のパーティションサービスに関連付けられたサービス・スレッドのブロッキングを回避する。サービス・スレッドは、すべての受信要求をハンドリングし、かつそれらの実行を調整する役割を果たすからである。こうして、サーバ側イベントモデルは分散データグリッドの性能を改良し得る。
【0053】
Coherenceの例では、$Service上のイベント・ディスパッチャ処理は、ほとんどのサーバ側イベントメッセージをハンドリングする役割を果たすスレッドとして用いられ得る。イベント・ディスパッチャ処理は、サーバ側で実行されると明示的に宣言される場合以外はクライアント側でハンドリングされるマップ・リスナーの形態のエンドユーザコードを典型的に実行する、ガードされたキューベースのプロセッサである。比較的小さい1組の機能がサーバ側で消費されるため、このスレッドはサーバ側イベントモデルの理想的な候補である。また、イベント・ディスパッチャは必要な保護でガードされる。さらに、イベント・ディスパッチャ処理は、キーによって順番にイベントを処理する単一のスレッド・キュー・プロセッサであり得る。順序付けが保証されるように、イベントのハンドリングは単一のスレッド上で行なわれ得る。
【0054】
図7は、分散データグリッド内の継続のサポートを示す図である。
図7に示されるように、サービス・スレッド701上の継続を要求する方法は、イベント前段階702およびイベント後段階704の2段階に分けることができる。イベント前段階は、必要なイベントが処理のためにワーカー・スレッド710にディスパッチされると終了する。イベント・ディスパッチャがイベントハンドリング706を完了すると、ワーカー・スレッドがサービス・スレッドに応答メッセージをポストバックすることによって、要求処理がイベント後段階で継続される。換言すれば、イベントがハンドリングされたという応答がポストバックされるとイベント後段階が継続する。
【0055】
ある実施形態に従い、継続サポートは、イベント・ディスパッチャ・スレッドにイベントをポストすることによって達成され得る。たとえば、パーティション転送イベントが継続をサポートし得る。特定のエントリに対する修正とは異なり、パーティション転送は、ユーザが継続に対処する際に同一のスレッド(サービス・スレッド)から1組のパーティションを確実にロックおよびロック解除できるようにするために、サービス・スレッド上で実行可能である。さらに、パーティション転送イベントによってインターセプタがパーティション全体にわたって反復する可能性が高いことを考えると、パーティション転送ロジックは、それが長期間にわたってブロックされることを防止するために、サービス・スレッド上で実行されなくてもよい。
【0056】
ある実施形態に従い、コミット後のイベントは、これらが提供されるエントリが不変であるため、分散データグリッド内部の要求処理のフローを中断する能力を有しない。1つの要件は、コミット後のイベントがキーによって順番に実行されることであり、これは、イベントハンドリングをワーカー・スレッドからイベント・ディスパッチャ・スレッドにオフロードして進むことによって単純に達成され得る。この場合も、Coherenceでは、イベントハンドリングのオフロードは、イベントオブジェクトをイベント・ディスパッチャ・スレッドにポストすることによって達成され得る。
【0057】
ある実施形態に従い、イベント・ディスパッチャ上にディスパッチされるすべてのイベントがイベント・ディスパッチャ・キューに配置され得る。Coherenceでは、イベント・ディスパッチャは、典型的にSerice$DispatchEventオブジェクトであるRunnableを実行する。DispatchUEMEventオブジェクトは、公的にディスパッチされる必要のあるUEMEventオブジェクト、およびイベントをディスパッチするUEMEventDispatcherオブジェクトへの参照を含む、PartitionedCache上の専用のService$DispatchEvent子コンポーネントであり得る。
【0058】
リスティング7において以下に示されるように、DispatchUEMEventオブジェクトは、必要とされる特定のリターンまたは継続をハンドリングする役割を果たす子オブジェクトを有し得る。必要な情報は、多様性に基づいてイベントがディスパッチされたあとにカプセル化され得る。
【数6】
【0059】
特定のDispatchUEMEventインスタンスの実行が終了すると、ワーカー・スレッドからの応答がサービス・スレッドにポストバックされ得る。データパーティション転送をサポートする例では、基本的なPartitionedCache$Acknowledgementコンポーネントを拡張する2つの応答メッセージ、すなわちPostDepartedメッセージおよびPostArrivedメッセージがあり得る。DispatchTransferDepartingコンポーネントのrunAfter方法は、PostDepartedメッセージをサービス・スレッドにポストバックする役割を果たし得る。DispatchTransferDepartingコンポーネントは、DispatchUEMEventを拡張し、StorageTransferEvent.DEPARTINGイベントをCoherence EventDispatcherスレッド上のUEMEventDispatcherに発生させる役割を果たす。さらに、DispatchTransferArrivedコンポーネントのrunAfter方法は、PostArrivedメッセージをサービス・スレッドにポストバックする役割を果たし得る。DispatchTransferArrivedコンポーネントはさらにDispatchUEMEventを拡張し、StorageTransferEvent.ARRIVEDイベントをCoherence EventDispatcherスレッド上のUEMEventDispatcherに発生させる役割を果たす。
【0060】
本開示に記載されるさまざまな文脈の全体にわたって、本発明の実施形態は、上述のシステムおよび方法を実行するように構成されたコンピュータ装置、演算システムおよび機械読取可能媒体をさらに含む。特別に設計された集積回路または他の電子機器からなる実施形態に加えて、本発明は本開示の教示に従ってプログラムされた汎用または専用デジタルコンピュータまたはマイクロプロセッサを用いて便利に実現され得、これはコンピュータ技術の当業者にとって明らかになるであろう。
【0061】
本開示の教示に基づいて適切なソフトウェアコーディングが熟練のプログラマによって作成され得、これはソフトウェア技術の当業者にとって明らかになるであろう。本発明は特定用途向け集積回路を作成することによって、または従来のコンポーネント回路の適切なネットワークを相互接続することによっても実現され得、これは当業者にとって明らかになるであろう。
【0062】
さまざまな実施形態は、本明細書中に提示された特徴のいずれかを実行するように(1つまたは複数の)汎用または専用の演算プロセッサ/装置をプログラムするために使用できる命令が格納された(1つまたは複数の)記憶媒体であるコンピュータプログラム製品を含む。記憶媒体は、フロッピーディスク(登録商標)、光ディスク、DVD、CD−ROM、マイクロドライブ、光磁気ディスク、ホログラフィック記憶装置、ROM、RAM、PRAM、EPROM、EEPROM、DRAM、VRAM、フラッシュメモリデバイス、磁気または光カード、ナノシステム(分子メモリICを含む)を含む任意の種類の物理的媒体、紙または紙ベースの媒体、ならびに命令および/または情報を記憶するのに適した任意の種類の媒体またはデバイスを含み得るが、これらに限定されない。コンピュータプログラム製品は全体的または部分的に、1つ以上の公的および/または私的ネットワーク上で送信可能であり、当該送信は、本明細書中に提示された特徴のいずれかを実行するための1つ以上のプロセッサによって使用できる命令を含む。当該送信は複数の別個の送信を含み得る。しかし、ある一定の実施形態に従って、命令を含むコンピュータ記憶媒体は、一時的ではなく(すなわち、送信処理中でなく)、むしろ物理的デバイス上に持続される。
【0063】
本発明の好ましい実施形態のこれまでの記載は例示および説明を目的として提供されている。すべてを網羅するまたは本発明を開示された形態そのものに限定することは意図されていない。多くの変更および変形が当業者にとって明らかになり得る。変形は、開示された特徴の組み合わせを含み得る。実施形態は、本発明の原理およびその実際の応用を最もうまく説明することによって関連技術の当業者が本発明を理解できるようにするために、選択され説明された。本発明の範囲は、以下の特許請求の範囲およびその均等物によって定められることが意図されている。