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ライブラリを探します(図19-1 を参照)。
「OK」をクリックします。
必要な構成ファイルを作成し、そのパスをアプリケーション構成設定で指定します。そのためには、アプリケーション構成ファイルをプロジェクトに追加し(存在しない場合)、Coherence for .NETの構成セクション(<coherence/>)をそのファイルに追加します。
注意:
app.config/web.configでこれらの構成ファイルが指定されていない場合、Coherenceでは、アプリケーションのデプロイ先フォルダか、Webアプリケーションの場合はWebアプリケーションのルートで、構成ファイルが検索されます。「プログラムによる.NETクライアントの構成」で説明しているように、キャッシュ構成ファイルをプログラムで指定することもできます。
<?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 for .NETの構成」を参照)。このキャッシュ構成ディスクリプタは、DefaultConfigurableCacheFactoryで使用されます。
pof-config: アプリケーションで使用するカスタム型を登録するために、ConfigurablePofContextで使用される構成ディスクリプタのパスを記述します。POFの使用手順の詳細は、「Coherence .NETクライアント・ライブラリの使用」を参照してください。
図19-2 は、構成ファイルを追加した後のソリューションを示しています。
この項では、.NETアプリケーション内でCoherenceのキャッシュと相互作用するために使用するプライマリCoherence .NET APIについて重点的に説明します。この項の内容は、次のとおりです。
CacheFactoryは、Coherence for .NETクライアント・アプリケーションのエントリ・ポイントです。CacheFactoryはINamedCacheインスタンスのファクトリであり、ロギングのための様々なメソッドを提供します。明示的に構成していない場合は、アセンブリが埋め込まれたリソースであるデフォルトの構成ファイルcoherence.xmlが使用されます。このデフォルトの構成ファイルは無効にできます。そのためには、アプリケーション構成ファイルのCoherence for .NET構成セクションにcache-factory-config要素を追加し、その値を目的の構成ファイルのパスに設定します。「プログラムによる.NETクライアントの構成」で説明しているように、キャッシュ構成ファイルをプログラムで指定することもできます。
<?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で指定されます。
<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要素を追加して、その値を構成ファイルのパスに設定します。「プログラムによる.NETクライアントの構成」で説明しているように、キャッシュ構成ファイルをプログラムで指定することもできます。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="coherence" type="Tangosol.Config.CoherenceConfigHandler, Coherence"/>
</configSections>
<coherence>
<cache-config>my-cache-config.xml</cache-config>
...
</coherence>
</configuration>
Loggerは次のlogging-config要素を使用して構成します。
destination: Loggerで使用するLogOutputのタイプを指定します。有効な値は次のとおりです。
common-logger (Common.Loggingの場合)
stderr (Console.Errorの場合)
stdout (Console.Outの場合)
ファイル・パス(メッセージをファイルに送信する必要がある場合)
severity-level: メッセージをログに記録するために満たすか、または超過する必要のあるログ・レベルを指定します。
logger-name: ロガーの名前を指定します。デフォルト値はCoherenceです。
message-format: ログ・メッセージの書式を決定します。
character-limit: ロガー・デーモンがメッセージ・キューから処理する文字の最大数を決定します。この数を超過すると、キューに残っているメッセージがすべて破棄されます。
...
<logging-config>
<destination>common-logger</destination>
<logger-name>Coherence</logger-name>
<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): 対象のキャッシュから索引を削除します。
次の例では、年齢プロパティの値が55以上であるすべてのエントリのキーを効率よく問い合せています。
IValueExtractor extractor = new ReflectionExtractor("getAge");
cache.AddIndex(extractor, true, null);
ICollection keys = cache.GetKeys(new GreaterEqualsFilter(extractor, 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列挙値を使用してモニター対象とするイベントのタイプを指定します。
次の例では、IsMarriedプロパティ値がtrueに設定されたEmployeeオブジェクトがキャッシュに挿入されると、フィルタがtrueに評価されます。
new CacheEventFilter(CacheEventMask.Inserted, new EqualsFilter("IsMarried", true));
次の例では、キャッシュからオブジェクトが1つでも削除されると、フィルタがtrueに評価されます。
new CacheEventFilter(CacheEventMask.Deleted);
次の例では、EmployeeオブジェクトのLastNameプロパティがSmithから変更されると、フィルタがtrueに評価されます。
new CacheEventFilter(CacheEventMask.UpdatedLeft, new EqualsFilter("LastName", "Smith"));
INamedCacheインタフェースには、キャッシュ・コンテンツの変更時に発行されるイベントを受信する、キャッシュ・リスナーを追加する機能があります。このイベントはサーバーから送信され、バックグラウンド・スレッドによって登録済のリスナーにディスパッチされます。
.NETのシングルスレッド・アパートメント・モデルでは、あるスレッドで作成されたWindowsフォームのコントロールを別のスレッドで更新することが禁止されています。イベント通知によって1つ以上のコントロールを更新する場合は、キャッシュ・イベントへの応答として実行する必要のあるイベント処理コードをUIスレッド上で実行する必要があります。WindowsFormsCacheListenerヘルパー・クラスを使用すれば、エンド・ユーザーはこの事実を意識することなく、Coherenceキャッシュ・イベント(発生元はつねにバックグラウンド・スレッド)をUIスレッドで発生したイベントと同様に処理できます。このクラスにより、コールが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の各メソッドは、キャッシュ・イベントに応じてコールされます。
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実装が含まれています。
次の例では、値が5であるすべてのエントリのキーが取得されます。
EqualsFilter equalsFilter = new EqualsFilter(IdentityExtractor.Instance, 5); ICollection keys = cache.GetKeys(equalsFilter);
次の例では、値が55以上であるすべてのキーが取得されます。
GreaterEqualsFilter greaterEquals = new GreaterEqualsFilter(IdentityExtractor.Instance, 55); ICollection keys = cache.GetKeys(greaterEquals);
次の例では、値がBelgで始まるすべてのキャッシュ・エントリが取得されます。
LikeFilter likeFilter = new LikeFilter(IdentityExtractor.Instance, "Belg%", '\\', true); ICollection entries = cache.GetEntries(likeFilter);
次の例では、値がan(大文字と小文字を区別)で終わるか、またはAn(大文字と小文字の区別なし)で始まるすべてのキャッシュ・エントリを取得します。
OrFilter orFilter = new OrFilter(new LikeFilter(IdentityExtractor.Instance, "%an", '\\', false), new LikeFilter(IdentityExtractor.Instance, "An%", '\\', true)); ICollection entries = cache.GetEntries(orFilter);
エクストラクタは、オブジェクトから値を抽出するために使用されます。すべてのエクストラクタはIValueExtractorインタフェースを実装する必要があります。
Extract(object target): 渡されたオブジェクトから値を抽出します。
Coherence for .NETには次のエクストラクタがあります。
IdentityExtractor: 渡された値から何も抽出せず、その値そのものを返す単純な実装です。
KeyExtractor: 値ではなく主要なオブジェクトに対して問合せを実行する必要があることを示す、特殊な目的の実装です。
ReflectionExtractor: 指定したオブジェクトのプロパティから値を抽出します。
MultiExtractor: エクストラクタの配列に基づく複合的なIValueExtractor実装です。配列内のエクストラタはすべて同じターゲット・オブジェクトに適用され、抽出した値のIListが抽出結果となります。
ChainedExtractor: エクストラクタの配列に基づく複合的なIValueExtractor実装です。配列内のエクストラクタは左から右に順次適用され、前のエクストラクタの結果が次のエクストラクタのターゲット・オブジェクトとなります。
POFエクストラクタおよびPOFアップデータは、SimplePofPathクラスを使用してChainedExtractorsと同じ機能を提供します。POFエクストラクタおよびPOFアップデータの詳細は、『Oracle Coherenceでのアプリケーションの開発』およびOracle Coherence .NET APIリファレンスを参照してください。
次の例では、キーの値が5より大きいすべてのキャッシュ・エントリが取得されます。
IValueExtractor extractor = new KeyExtractor(IdentityExtractor.Instance); IFilter filter = new GreaterFilter(extractor, 5); ICollection entries = cache.GetEntries(filter);
次の例では、値のCityプロパティがcity1と等しいすべてのキャッシュ・エントリが取得されます。
IValueExtractor extractor = new ReflectionExtractor("City");
IFilter filter = new EqualsFilter(extractor, "city1");
ICollection entries = cache.GetEntries(filter);
入力プロセッサは、キャッシュ内のエントリ・オブジェクトに対して作動するエージェントです。
すべての入力プロセッサはIEntryProcessorインタフェースを実装する必要があります。
Process(IInvocableCacheEntryエントリ): 指定されたエントリを処理します。
ProcessAll(ICollectionエントリ): エントリのコレクションを処理します。
Coherence for .NETでは、Tangosol.Util.ProcessorネームスペースにいくつかのIEntryProcessor実装が含まれています。
次の例は、条件付き設定を示しています。key1に現在マップされている値が600より大きい場合にのみ、この値が680に設定されます。
IFilter greaterThen600 = new GreaterFilter(IdentityExtractor.Instance, 600);
IEntryProcessor processor = new ConditionalPut(greaterThen600, 680);
cache.Invoke("key1", processor);
次の例では、キーがBGDであるTemperatureオブジェクトに対し、UpdaterProcessorを使用してそのオブジェクトのDegreeプロパティを新しい値26に更新します。
cache.Insert("BGD", new Temperature(25, 'c', 12));
IValueUpdater updater = new ReflectionUpdater("setDegree");
IEntryProcessor processor = new UpdaterProcessor(updater, 26);
object result = cache.Invoke("BGD", processor);
エントリ・アグリゲータは、IInvocableCacheにあるエントリの一部のサブセットに対して実行し、集計結果を得るように指定できる処理を表します。集計の一般的な例として、最小、最大、合計、平均などの関数があります。ただし、集計の概念は、エントリのグループを評価して1つの答えを算出する必要のある任意のプロセスに適用されます。集計は、分散環境などで並列に実行する機能を明示的に備えています。
すべてのアグリゲータはIEntryAggregatorインタフェースを実装する必要があります。
Aggregate(ICollectionエントリ): エントリのコレクションを処理して集約結果を生成します。
Coherence for .NETでは、Tangosol.Util.AggregatorネームスペースにいくつかのIEntryAggregator実装が含まれています。
次の例では、キャッシュのサイズを返されます。
IEntryAggregator aggregator = new Count(); object result = cache.Aggregate(cache.Keys, aggregator);
次の例では、キャッシュ内の一意の値と等しいキーを持ち、かつキャッシュ内の対応する値のインスタンス数と等しい値を持つIDictionaryが返されます。
IEntryAggregator aggregator = GroupAggregator.CreateInstance(IdentityExtractor.Instance, new Count()); object result = cache.Aggregate(cache.Keys, aggregator);
注意:
GUID-B96689CE-EDA4-4DFD-87DE-66C146731C40.htm#GUID-B77E31B9-6F72-4A8B-BCB2-CC3935AFA1F4__CBAHGDEGおよびGUID-B96689CE-EDA4-4DFD-87DE-66C146731C40.htm#GUID-B77E31B9-6F72-4A8B-BCB2-CC3935AFA1F4__CBABJJCHは簡単な例にすぎず、大量のキーやサイズがきわめて大きいキーを渡す用途には実用的ではありません。そのような用途では、GroupAggregator.CreateInstance(String, IEntryAggregator, IFilter)メソッドを使用してAlwaysFilterオブジェクトを渡します。
キャッシュした値オブジェクト同様、IFilter、IExtractor、IProcessorおよびIAggregatorのすべてのカスタム実装クラスは、.NETアプリケーションのPOFコンテキストおよびクライアントが接続されているクラスタ側ノードのPOFコンテキストに正しく登録する必要があります。したがって、カスタムの.NET型の対応するJava実装を、クラスタ側ノードで作成、コンパイルおよびデプロイする必要があります。このようなカスタム型を実際に実行するのは、.NETの実装ではなくJavaの実装であることに注意してください。
詳細は、「統合オブジェクトの構築(.NET)」を参照してください。
クライアントは、実行時にCoherence構成ファイルをプログラムでロードできます。構成ファイルでは、アプリケーション構成ファイルに指定された構成ファイルを上書きします。アプリケーション構成ファイルでのCoherence構成ファイルの指定の詳細は、「Coherence .NETクライアント・ライブラリの設定」を参照してください。
次の例では、pofConfig.xml、cacheConfig.xmlおよびcoherenceConfig.xmlの各ファイルをロードします。
using System;
using System.IO;
using Tangosol.IO.Pof;
using Tangosol.Net;
using Tangosol.Run.Xml;
namespace configExample
{
internal class TestPofContext : ConfigurablePofContext
{
public TestPofContext()
: base("config/pofConfig.xml")
{
}
}
internal class TestClient
{
private static void Main(string[] args)
{
try
{
CacheFactory.Configure("config/cacheConfig.xml",
"config/coherenceConfig.xml");
var cache = CacheFactory.GetCache("dist-test");
cache["key"] = new TestValue(1, "Test");
Console.Out.WriteLine("key=" + cache["key"]);
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadLine();
}
}
}