この章では、Coherence for .NETクライアント・ライブラリをアプリケーションに追加する手順を説明します。さらに、Coherence for C++ APIについて説明します。このAPIを使用すると、C++アプリケーションで、Coherenceクラスタ外部からCoherenceクラスタ・サービスにアクセスできます。
Coherence for .NET APIのドキュメントは2つの場所にあります。1つはOracle Coherence .NET APIリファレンスで、もう1つはCoherence for .NETのdoc
ディレクトリです。
この章には次の項が含まれます:
.NETアプリケーションでCoherence for .NETライブラリを使用するには、Coherence.dll
ライブラリへの参照をプロジェクトに追加し、必要な構成ファイルを作成する必要があります。
Coherence.dll
への参照を作成する手順は、次のとおりです。
プロジェクトで「プロジェクト」→「参照の追加」を選択するか、または「ソリューション エクスプローラ」の「参照設定」を右クリックして「参照の追加」を選択します。「参照の追加」ウィンドウが表示されます。
「参照の追加」ウィンドウから、「参照」タブを選択し、ファイル・システム上のCoherence.dll
ライブラリを探します(図18-1を参照)。
「OK」をクリックします。
次に、必要な構成ファイルを作成し、そのパスをアプリケーション構成設定で指定する必要があります。そのためには、アプリケーション構成ファイルをプロジェクトに追加し(存在しない場合)、Coherence for .NETの構成セクション(<coherence/>
)をそのファイルに追加します。
注意:
|
例18-1 アプリケーション構成ファイルのサンプル
<?xml version="1.0"?> <configuration> <configSections> <section name="coherence" type="Tangosol.Config.CoherenceConfigHandler, Coherence"/> </configSections> <coherence> <cache-factory-config>my-coherence.xml</cache-factory-config> <cache-config>my-cache-config.xml</cache-config> <pof-config>my-pof-config.xml</pof-config> </coherence> </configuration>
Coherence for .NETの構成セクションの要素は次のとおりです。
cache-factory-config
: IConfigurableCacheFactory
およびLogger
を構成するためにCacheFactory
で使用されるオペレーション構成・ディスクリプタのパスを記述します。
cache-config
: キャッシュ構成(「Coherence*Extendの構成」を参照)を含むキャッシュ構成ファイルのパスを記述します。このキャッシュ構成ディスクリプタは、DefaultConfigurableCacheFactory
で使用されます。
pof-config
: アプリケーションで使用するカスタム型を登録するために、ConfigurablePofContext
で使用される構成ディスクリプタのパスを記述します。POFの使用手順の詳細は、第18章「Coherence .NETクライアント・ライブラリの使用」を参照してください。
図18-2は、構成ファイルを追加した後のソリューションを示しています。
この項では、.NETアプリケーション内でCoherenceのキャッシュと相互作用するために使用するプライマリCoherence .NET APIについて重点的に説明します。この項には、次のトピックが含まれます:
CacheFactory
は、Coherence for .NETクライアント・アプリケーションのエントリ・ポイントです。CacheFactory
はINamedCache
インスタンスのファクトリであり、ロギングのための様々なメソッドを提供します。それは、明示的に構成されていない場合、アセンブリが埋め込まれたリソースであるデフォルトの構成ファイルcoherence.xml
を使用します。このデフォルトの構成ファイルは無効にできます。そのためには、アプリケーション構成ファイルのCoherence for .NET構成セクションにcache-factory-config
要素を追加し、その値を目的の構成ファイルのパスに設定します。
例18-2 INamedCacheインスタンスのファクトリの構成
<?xml version="1.0"?> <configuration> <configSections> <section name="coherence" type="Tangosol.Config.CoherenceConfigHandler, Coherence"/> </configSections> <coherence> <cache-factory-config>my-coherence.xml</cache-factory-config> ... </coherence> </configuration>
このファイルには、CacheFactory
で静的なプロパティを使用して公開される次の2つのコンポーネントが構成されています。
CacheFactory.ConfigurableCacheFactory
: CacheFactory
でINamedCache
インスタンスの取得、解放および破棄に使用されるIConfigurableCacheFactory
実装
CacheFactory.Logger
: メッセージと例外を記録するために使用されるLogger
インスタンス
CacheFactory
の使用が終了したら(アプリケーションをシャットダウンする場合など)、Shutdown()
メソッドを使用してCacheFactory
をシャットダウンする必要があります。このメソッドによって、すべてのサービスとLogger
インスタンスが終了します。
IConfigurableCacheFactory
実装は、<configurable-cache-factory-config>
要素の内容で指定されます。
class-name
: 実装タイプをそのアセンブリ修飾名で指定します。
init-params
: IConfigurableCacheFactory
のインスタンス化に使用されるパラメータを定義します。各パラメータは、対応する子要素param-type
およびparam-value
で指定されます。
例18-3 ConfigurableCacheFactory実装の構成
<coherence> <configurable-cache-factory-config> <class-name>Tangosol.Net.DefaultConfigurableCacheFactory, Coherence</class-name> <init-params> <init-param> <param-type>string</param-type> <param-value>simple-cache-config.xml</param-value> </init-param> </init-params> </configurable-cache-factory-config> </coherence>
IConfigurableCacheFactory
実装が構成に定義されていない場合は、デフォルトの実装(DefaultConfigurableCacheFactory
)が使用されます。
DefaultConfigurableCacheFactory
は、前述のキャッシュ構成ディスクリプタ(「クライアント側のキャッシュ構成ディスクリプタ」を参照)で宣言されているキャッシュにアクセスするための機能を提供します。DefaultConfigurableCacheFactory
で使用されるデフォルトの構成ファイルは$AppRoot/coherence-cache-config.xml
です。$AppRoot
は、作業ディレクトリ(Windowsフォーム・アプリケーションの場合)またはアプリケーションのルート(Webアプリケーションの場合)です。
別のキャッシュ構成ディスクリプタ・ファイルを指定する場合は、アプリケーション構成ファイルのCoherence for .NET構成セクションにcache-config
要素を追加して、その値を構成ファイルのパスに設定します。
Logger
は次のlogging-config
要素を使用して構成します。
destination
: Loggerで使用するLogOutput
のタイプを指定します。有効な値は次のとおりです。
common-logger
(Common.Logging
の場合)
stderr
(Console.Error
の場合)
stdout
(Console.Out
の場合)
ファイル・パス(メッセージをファイルに送信する必要がある場合)
severity-level
: メッセージをログに記録するために満たすか、または超過する必要のあるログ・レベルを決定します。
message-format
: ログ・メッセージの書式を決定します。
character-limit
: ログ出力デーモンがメッセージ・キューから処理する文字の最大数を決定します。この数を超過すると、キューに残っているメッセージがすべて破棄されます。
例18-5 Loggerの構成
... <logging-config> <destination>common-logger</destination> <severity-level>5</severity-level> <message-format>(thread={thread}): {text}</message-format> <character-limit>8192</character-limit> </logging-config> ...
CacheFactory
は、INamedCache
のインスタンスを取得および解放する、次の静的メソッドを提供します。
GetCache(String cacheName)
: リモートのCoherenceクラスタ内で稼働する、指定されたcacheName
のNamedCache
に対応するINamedCache
実装を取得します。
ReleaseCache(INamedCache cache)
: キャッシュの指定のインスタンスに関連付けられているローカル・リソースをすべて解放します。解放したキャッシュは使用できなくなります。
DestroyCache(INamedCache cache)
: 指定されたキャッシュをCoherenceクラスタ全体で破棄します。
メッセージと例外を記録するためのメソッドは次のとおりです。
IsLogEnabled(int level)
: 指定された重大度のメッセージをLoggerで記録するかどうかを決定します。
Log(Exception e, int severity)
: 指定された重大度の例外を記録します。
Log(String message, int severity)
: 指定された重大度のテキスト・メッセージを記録します。
Log(String message, Exception e, int severity)
: 指定された重大度のテキスト・メッセージと例外を記録します。
ロギング・レベルはCacheFactory.LogLevel
のenum
の値で定義されます(昇順)。
Always
Error
Warn
Info
Debug
(デフォルトのログ・レベル)
Quiet
Max
Common.Logging
は、明確に定義された一連のインタフェースの背後で、各種の一般的なオープンソース・ロギング・ライブラリをプラグインできるようにするオープンソース・ライブラリです。現在サポートされているライブラリは、Log4Net(バージョン1.2.9と1.2.10)およびNLog
です。Common.Logging
は、現在Spring.NETフレームワークで使用されており、IBatis.NETおよびNHibernateの今後のリリースでも使用される可能性があります。このため、これらのフレームワークをCoherence for .NETと組み合せて使用している場合は、アプリケーション・レイヤー全体で一貫してロギングを構成できることから、Common.Loggingの使用を検討してください。
Coherence for .NETにはCommon.Logging
ライブラリが含まれていません。Logger構成にcommon-logger
を使用するには、Common.Logging
アセンブリをダウンロードし、そのアセンブリへの参照をプロジェクトに組み込みます。.NET用のCommon.Logging
アセンブリは、次の場所からダウンロードできます。
http://netcommon.sourceforge.net/
Coherence for .NETのCommon.Logging Logger実装は、これらのアセンブリの署名付きリリース・バージョンに対してコンパイルされています。
INamedCache
インタフェースはIDictionary
を拡張するため、ディクショナリと同様に操作できます。取得したINamedCache
インスタンスでは、いくつかのプロパティが公開されます。
CacheName
: キャッシュ名
Count
: キャッシュ・サイズ
IsActive
: キャッシュがアクティブ(つまり解放も破棄もされていない)かどうかを判定します。
Keys
: キャッシュ・マッピング内のすべてのキーのコレクション
Values
: キャッシュ・マッピング内のすべての値のコレクション
指定されたキーの値は、cache[key]
を使用して取得できます。同様に、新しい値を追加したり、プロパティを新しい値に設定することで古い値を変更したりできます(cache[key]
=
value
)。
キャッシュ・エントリのコレクションにアクセスするには、キャッシュ内のマッピングを反復処理するGetEnumerator()
を使用します。
INamedCache
インタフェースは、キャッシュの内容を操作するための複数のメソッドを提供します。
Clear()
: キャッシュからすべてのマッピングを削除します。
Contains(Object key)
: 指定されたキーのマッピングがキャッシュにあるかどうかを判定します。
GetAll(ICollection keys)
: 指定されたキー・コレクションにマップされているすべての値を返します。
Insert(Object key, Object value)
: キャッシュに新しいマッピングを挿入します。指定されたキーのマッピングが存在する場合は、その値が指定された値で上書きされ、古い値が返されます。
Insert(Object key, Object value, long millis)
: キャッシュに新しいマッピングを挿入しますが、有効期限がミリ秒単位で指定されます。
InsertAll(IDictionary dictionary)
: 指定されたディクショナリのすべてのマッピングをキャッシュにコピーします。
Remove(Object key)
: 指定されたキーのマッピングが存在する場合はそれを削除し、そのキーがマップされていた値を返します。
INamedCache
インタフェースは、この他にIQueryCache、IObservableCacheおよびIInvocableCacheの3つのインタフェースを拡張します。
IQueryCache
インタフェースは、様々なフィルタを使用してキャッシュを問い合せる機能を備えています。
GetKeys(IFilter filter)
: 対象のキャッシュに格納されているキーのうち、フィルタで表された基準を満たすエントリのキーのコレクションを返します。
GetEntries(IFilter filter)
: 対象のキャッシュに格納されているエントリのうち、フィルタで表された基準を満たすエントリのコレクションを返します。
GetEntries(IFilter filter, IComparer comparer)
: 対象のキャッシュに格納されているエントリのうち、フィルタで表された基準を満たすエントリのコレクションを返します。この場合、列挙子は必ずコレクションをエントリ値の昇順で横断します。エントリ値は指定されたcomparerでソートされているか、またはcomparerがnullの場合は自然な順序でソートされています。
さらにIQueryCache
インタフェースには、索引を追加または削除する機能があります。索引はキャッシュに格納されている値を対応するキーに関連付けるために使用され、GetKeys
メソッドとGetEntries
メソッドのパフォーマンスを大幅に向上します。
AddIndex(IValueExtractor extractor, bool isOrdered, IComparer comparator)
: 指定されたIValueExtractor
によって抽出された値を対応するエントリに対するキーに関連付ける索引を、対象のキャッシュに追加します。索引情報は順序付けることもできます。
RemoveIndex(IValueExtractor extractor)
: 対象のキャッシュから索引を削除します。
例18-6は、年齢プロパティの値が55以上であるすべてのエントリのキーを効率よく問い合せるコードを示しています。
QueryRecorder
クラスは指定されたフィルタの説明またはトレース・レコードを生成します。このクラスは、クラスタ内のすべてのノードを問い合せ、結果を集約する機能を持つ並列アグリゲータの実装です。このクラスでは2種類のレコードがサポートされています。その1つはExplain
レコードで、問合せ処理の間に実行されたフィルタの評価の見積りコストを提供します。もう1つはTrace
レコードで、問合せ処理の間に実行されたフィルタの評価の実際のコストを提供します。両方の問合せレコードでは、フィルタで索引が使用可能かどうかが考慮されます。EXPLAIN PLANレコードおよびトレース・レコードで提供されるデータの詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
問合せレコードを作成するには、RecordType
パラメータを指定する新しいQueryRecorder
インスタンスを作成します。テストするインスタンスとフィルタをAggregate
メソッドのパラメータとして含めます。次の例では、説明レコードを作成しています。
INamedCache cache = CacheFactory.GetCache(MyCache); IFilter filter = new OrFilter( new GreaterFilter(IdentityExtractor.Instance, 100), new LessFilter(IdentityExtractor.Instance, 30)); QueryRecorder aggregator = new QueryRecorder(QueryRecorder.RecordType.Explain); IQueryRecord record = (IQueryRecord) cache.Aggregate(filter, aggregator); Console.WriteLine(record.ToString());
トレース・レコードを作成するには、RecordType
パラメータをTrace
に変更します。
QueryRecorder aggregator = new QueryRecorder(QueryRecorder.RecordType.Trace);
IObservableCache
インタフェースは、キャッシュの内容が変更されたときにアプリケーションがイベントを受信できるようにします。変更イベントに関心があることを登録するには、そのキャッシュに対するListener
実装をアプリケーションで追加します。対象キャッシュでは、イベント・タイプ(挿入、更新、削除)、変更されたエントリのキー、およびエントリの古い値と新しい値などに関する情報を含むイベントが受信されます。
AddCacheListener(ICacheListener listener)
: キャッシュから発行されたすべてのイベント(挿入、更新、削除)を、そのキー、古い値および新しい値を含めて受信する標準のキャッシュ・リスナーを追加します。
RemoveCacheListener(ICacheListener listener)
: 以前に登録した標準のキャッシュ・リスナーを削除します。
AddCacheListener(ICacheListener listener, object key, bool isLite)
: 特定のキーに関するキャッシュ・リスナーを追加します。isLite
がtrue
である場合は、イベントに古い値と新しい値が含まれないことがあります。
RemoveCacheListener(ICacheListener listener, object key)
: 指定されたキーを使用して以前に登録されたキャッシュ・リスナーを削除します。
AddCacheListener(ICacheListener listener, IFilter filter, bool isLite)
: フィルタの評価に基づいてイベントを受信するキャッシュ・リスナーを追加します。isLiteがtrueである場合は、イベントに古い値と新しい値が含まれないことがあります。
RemoveCacheListener(ICacheListener listener, IFilter filter)
: 指定されたフィルタを使用して以前に登録されたキャッシュ・リスナーを削除します。
フィルタベースのメソッドを使用して登録されたListener
は、すべてのイベント・タイプ(挿入、更新、削除)を受信します。イベントをさらにフィルタリングするには、CacheEventFilter
内にフィルタをラップし、CacheEventMask
列挙値を使用して監視対象とするイベントのタイプを指定します。
図18-2では、IsMarried
プロパティ値がtrue
に設定されたEmployee
オブジェクトがキャッシュに挿入されると、フィルタがtrue
に評価されます。
例18-7 挿入されたオブジェクトに対するフィルタリング
new CacheEventFilter(CacheEventMask.Inserted, new EqualsFilter("IsMarried", true));
例18-8では、キャッシュからオブジェクトが1つでも削除されると、フィルタがtrue
に評価されます。
例18-9では、Employee
オブジェクトのLastName
プロパティがSmith
から変更されると、フィルタthat
がtrue
になります。
例18-9 変更されたオブジェクトに対するフィルタリング
new CacheEventFilter(CacheEventMask.UpdatedLeft, new EqualsFilter("LastName", "Smith"));
INamedCache
インタフェースには、キャッシュ・コンテンツの変更時に発行されるイベントを受信する、キャッシュ・リスナーを追加する機能があります。このイベントはサーバーから送信され、バックグラウンド・スレッドによって登録済のリスナーにディスパッチされます。
.NETのシングルスレッド・アパートメント・モデルでは、あるスレッドで作成されたWindowsフォームのコントロールを別のスレッドで更新することが禁止されています。イベント通知によって1つ以上のコントロールを更新する場合は、キャッシュ・イベントへの応答として実行する必要のあるイベント処理コードをUIスレッド上で実行する必要があります。WindowsFormsCacheListener
ヘルパー・クラスを使用すれば、エンド・ユーザーはこの事実を意識することなく、Coherenceキャッシュ・イベント(発生元はつねにバックグラウンド・スレッド)をUIスレッドで発生したイベントと同様に処理できます。このクラスにより、コールがUIスレッド上で適切にマーシャリングされて実行されるようになります。
このクラスの使用例を次に示します。
例18-10 UIスレッドでのコールのマーシャリングと実行
public partial class ContactInfoForm : Form { ... listener = new WindowsFormsCacheListener(this); listener.EntryInserted += new CacheEventHandler(AddRow); listener.EntryUpdated += new CacheEventHandler(UpdateRow); listener.EntryDeleted += new CacheEventHandler(DeleteRow); ... cache.AddCacheListener(listener); ... }
AddRow
、UpdateRow
およびDeleteRow
の各メソッドは、キャッシュ・イベントに応じてコールされます。
例18-11 キャッシュ・イベントに応じたメソッドのコール
private void AddRow(object sender, CacheEventArgs args) { ... } private void UpdateRow(object sender, CacheEventArgs args) { ... } private void DeleteRow(object sender, CacheEventArgs args) { ... }
CacheEventArgs
パラメータは、キャッシュ・イベントを発生させたIObservableCache
インスタンス、発生したCacheEventType
、およびキャッシュされたエントリのKey
、NewValue
、OldValue
をカプセル化します。
IInvocableCache
は、エントリ別処理と集計操作の両方を起動できるキャッシュです。キャッシュの内容に対する操作は、キャッシュによって(したがって、特定の領域に制限されたキャッシュの内容の中で)実行できます。この機能は特に分散環境で役立ちます。これは、処理対象のエントリが管理されている場所に処理を移すことで、処理を局所化して効率を高めることができるためです。
Invoke(object key, IEntryProcessor agent)
: 渡されたキーで指定されるエントリに対して渡されたプロセッサを起動し、その起動の結果を返します。
InvokeAll(ICollection keys, IEntryProcessor agent)
: 渡されたキーで指定されるエントリに対して渡されたプロセッサを起動し、それぞれの起動の結果を返します。
InvokeAll(IFilter filter, IEntryProcessor agent)
: 指定されたフィルタで選択されるエントリに対して渡されたプロセッサを起動し、それぞれの起動の結果を返します。
Aggregate(ICollection keys, IEntryAggregator agent)
: 渡されたキーで指定されるエントリに対して集約操作を実行します。
Aggregate(IFilter filter, IEntryAggregator agent)
: 指定されたフィルタで選択されるエントリに対して集約操作を実行します。
IQueryCache
インタフェースは、IFilter
実装を使用して表される、所定の基準を満たすキャッシュ・エントリを検索する機能を提供します。
すべてのフィルタはIFilterインタフェースを実装する必要があります。
Evaluate(object o)
: 指定されたオブジェクトにテストを適用し、テストに合格した場合はtrue
、そうでない場合はfalse
を返します。
Coherence for .NETでは、Tangosol.Util.Filter
ネームスペースにいくつかのIFilter
実装が含まれています。
例18-12のコードでは、値が5であるすべてのエントリのキーが取得されます。
例18-12 ある数値と等しいキーの取得
EqualsFilter equalsFilter = new EqualsFilter(IdentityExtractor.Instance, 5); ICollection keys = cache.GetKeys(equalsFilter);
例18-13のコードでは、値が55以上であるすべてのキーが取得されます。
例18-13 ある数値より大きいか、それと等しいキーの取得
GreaterEqualsFilter greaterEquals = new GreaterEqualsFilter(IdentityExtractor.Instance, 55); ICollection keys = cache.GetKeys(greaterEquals);
例18-14のコードでは、値がBelg
で始まるすべてのキャッシュ・エントリが取得されます。
例18-14 ある文字列値に基づいたキーの取得
LikeFilter likeFilter = new LikeFilter(IdentityExtractor.Instance, "Belg%", '\\', true); ICollection entries = cache.GetEntries(likeFilter);
例18-15のコードでは、値がan
(大文字と小文字を区別)で終わるか、またはAn
(大文字と小文字の区別なし)で始まるすべてのキャッシュ・エントリを取得します。
エクストラクタは、オブジェクトから値を抽出するために使用されます。すべてのエクストラクタはIValueExtractor
インタフェースを実装する必要があります。
Extract(object target)
: 渡されたオブジェクトから値を抽出します。
Coherence for .NETには次のエクストラクタがあります。
IdentityExtractor
: 渡された値から何も抽出せず、その値そのものを返す単純な実装です。
KeyExtractor
: 値ではなく主要なオブジェクトに対して問合せを実行する必要があることを示す、特殊な目的の実装です。
ReflectionExtractor
: 指定したオブジェクトのプロパティから値を抽出します。
MultiExtractor
: エクストラクタの配列に基づく複合的なIValueExtractor
実装です。配列内のエクストラタはすべて同じターゲット・オブジェクトに適用され、抽出した値のIList
が抽出結果となります。
ChainedExtractor
: エクストラクタの配列に基づく複合的なIValueExtractor
実装です。配列内のエクストラクタは左から右に順次適用され、前のエクストラクタの結果が次のエクストラクタのターゲット・オブジェクトとなります。
例18-16のコードでは、キーの値が5より大きいすべてのキャッシュ・エントリが取得されます。
例18-16 ある数値より大きいキャッシュ・エントリの取得
IValueExtractor extractor = new KeyExtractor(IdentityExtractor.Instance); IFilter filter = new GreaterFilter(extractor, 5); ICollection entries = cache.GetEntries(filter);
例18-17のコードでは、値のCity
プロパティがcity1
と等しいすべてのキャッシュ・エントリが取得されます。
入力プロセッサは、キャッシュ内のエントリ・オブジェクトに対して作動するエージェントです。
すべての入力プロセッサはIEntryProcessor
インタフェースを実装する必要があります。
Process(IInvocableCacheEntryエントリ)
: 指定されたエントリを処理します。
ProcessAll(ICollectionエントリ)
: エントリのコレクションを処理します。
Coherence for .NETでは、Tangosol.Util.Processor
ネームスペースにいくつかのIEntryProcessor
実装が含まれています。
例18-18のコードは、条件付き設定を示しています。key1
に現在マップされている値が600
より大きい場合にのみ、この値が680
に設定されます。
例18-18 ある数値に基づいたキー値の条件付き設定
IFilter greaterThen600 = new GreaterFilter(IdentityExtractor.Instance, 600); IEntryProcessor processor = new ConditionalPut(greaterThen600, 680); cache.Invoke("key1", processor);
例18-19のコードでは、キーがBGD
であるTemperature
オブジェクトに対し、UpdaterProcessor
を使用してそのオブジェクトのDegree
プロパティを新しい値26
に更新します。
エントリ・アグリゲータは、IInvocableCache
にあるエントリの一部のサブセットに対して実行し、集計結果を得るように指定できる処理を表します。集計の一般的な例として、最小、最大、合計、平均などの関数があります。ただし、集計の概念は、エントリのグループを評価して1つの答えを算出する必要のある任意のプロセスに適用されます。集計は、分散環境などで並列に実行する機能を明示的に備えています。
すべてのアグリゲータはIEntryAggregator
インタフェースを実装する必要があります。
Aggregate(ICollectionエントリ)
: エントリのコレクションを処理して集約結果を生成します。
Coherence for .NETでは、Tangosol.Util.Aggregator
ネームスペースにいくつかのIEntryAggregator
実装が含まれています。
例18-20のコードでは、キャッシュのサイズが返されます。
例18-20 キャッシュのサイズを返す
IEntryAggregator aggregator = new Count(); object result = cache.Aggregate(cache.Keys, aggregator);
例18-21のコードでは、キャッシュ内の一意の値と等しいキーを持ち、かつキャッシュ内の対応する値のインスタンス数と等しい値を持つIDictionary
が返されます。
例18-21 IDictionaryを返す
IEntryAggregator aggregator = GroupAggregator.CreateInstance(IdentityExtractor.Instance, new Count()); object result = cache.Aggregate(cache.Keys, aggregator);
キャッシュした値オブジェクト同様、IFilter
、IExtractor
、IProcessor
およびIAggregator
のすべてのカスタム実装クラスは、.NETアプリケーションのPOFコンテキストおよびクライアントが接続されているクラスタ側ノードのPOFコンテキストに正しく登録する必要があります。したがって、カスタムの.NET型の対応するJava実装を、クラスタ側ノードで作成、コンパイルおよびデプロイする必要があります。このようなカスタム型を実際に実行するのは、.NETの実装ではなくJavaの実装であることに注意してください。
詳細は、第17章「統合オブジェクトの構築(.NET)」を参照してください。