プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceリモート・クライアントの開発
12c (12.1.3)
E56210-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

18 Coherence .NETクライアント・ライブラリの使用

この章では、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ディレクトリです。

この章には次の項が含まれます:

18.1 Coherence .NETクライアント・ライブラリの設定

.NETアプリケーションでCoherence for .NETライブラリを使用するには、Coherence.dllライブラリへの参照をプロジェクトに追加し、必要な構成ファイルを作成する必要があります。

Coherence.dllへの参照を作成する手順は、次のとおりです。

  1. プロジェクトで「プロジェクト」→「参照の追加」を選択するか、または「ソリューション エクスプローラ」の「参照設定」を右クリックして「参照の追加」を選択します。「参照の追加」ウィンドウが表示されます。

  2. 参照の追加」ウィンドウから、「参照」タブを選択し、ファイル・システム上のCoherence.dllライブラリを探します(図18-1を参照)。

    図18-1 「参照の追加」ウィンドウ

    図18-1の説明が続きます
    「図18-1 「参照の追加」ウィンドウ」の説明

  3. 「OK」をクリックします。

次に、必要な構成ファイルを作成し、そのパスをアプリケーション構成設定で指定する必要があります。そのためには、アプリケーション構成ファイルをプロジェクトに追加し(存在しない場合)、Coherence for .NETの構成セクション(<coherence/>)をそのファイルに追加します。


注意:

app.config/web.configでこれらの構成ファイルが指定されていない場合、Coherenceでは、アプリケーションのデプロイ先フォルダか、Webアプリケーションの場合はWebアプリケーションのルートで、構成ファイルが検索されます。

例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は、構成ファイルを追加した後のソリューションを示しています。

図18-2 構成ファイルを表示しているファイル・システム

図18-2の説明が続きます
「図18-2 構成ファイルを表示しているファイル・システム」の説明

18.2 Coherence .NET APIの使用

この項では、.NETアプリケーション内でCoherenceのキャッシュと相互作用するために使用するプライマリCoherence .NET APIについて重点的に説明します。この項には、次のトピックが含まれます:

18.2.1 CacheFactory

CacheFactoryは、Coherence for .NETクライアント・アプリケーションのエントリ・ポイントです。CacheFactoryINamedCacheインスタンスのファクトリであり、ロギングのための様々なメソッドを提供します。明示的に構成していない場合は、アセンブリが埋め込まれたリソースであるデフォルトの構成ファイル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: CacheFactoryINamedCacheインスタンスの取得、解放および破棄に使用されるIConfigurableCacheFactory実装

  • CacheFactory.Logger: メッセージと例外を記録するために使用されるLoggerインスタンス

CacheFactoryの使用が終了したら(アプリケーションをシャットダウンする場合など)、Shutdown()メソッドを使用してCacheFactoryをシャットダウンする必要があります。このメソッドによって、すべてのサービスとLoggerインスタンスが終了します。

18.2.2 IConfigurableCacheFactory

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)が使用されます。

18.2.3 DefaultConfigurableCacheFactory

DefaultConfigurableCacheFactoryは、前述のキャッシュ構成ディスクリプタ(「クライアント側のキャッシュ構成ディスクリプタ」を参照)で宣言されているキャッシュにアクセスするための機能を提供します。DefaultConfigurableCacheFactoryで使用されるデフォルトの構成ファイルは$AppRoot/coherence-cache-config.xmlです。$AppRootは、作業ディレクトリ(Windowsフォーム・アプリケーションの場合)またはアプリケーションのルート(Webアプリケーションの場合)です。

別のキャッシュ構成ディスクリプタ・ファイルを指定する場合は、アプリケーション構成ファイルのCoherence for .NET構成セクションにcache-config要素を追加して、その値を構成ファイルのパスに設定します。

例18-4 別のキャッシュ構成ディスクリプタ・ファイルの指定

<?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>

18.2.4 Logger

Loggerは次のlogging-config要素を使用して構成します。

  • destination: Loggerで使用するLogOutputのタイプを指定します。有効な値は次のとおりです。

    • Common.Loggingにはcommon-logger

    • Console.Errorにはstderr

    • Console.Outにはstdout

    • ファイル・パス(メッセージをファイルに送信する必要がある場合)

  • severity-level: メッセージをログに記録するために満たすか、または超過する必要のあるログ・レベルを指定します。

  • logger-name: ロガーの名前を指定します。デフォルト値はCoherenceです。

  • message-format: ログ・メッセージの書式を決定します。

  • character-limit: ロガー・デーモンがメッセージ・キューから処理する文字の最大数を決定します。この数を超過すると、キューに残っているメッセージがすべて破棄されます。

例18-5 Loggerの構成

...
<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クラスタ内で稼働する、指定されたcacheNameNamedCacheに対応する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.LogLevelenumの値で定義されます(昇順)。

  • Always

  • Error

  • Warn

  • Info

  • Debug(デフォルトのログ・レベル)

  • Quiet

  • Max

18.2.5 Common.Loggingライブラリの使用

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実装は、これらのアセンブリの署名付きリリース・バージョンに対してコンパイルされています。

18.2.6 INamedCache

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インタフェースは、この他にIQueryCacheIObservableCacheおよびIInvocableCacheの3つのインタフェースを拡張します。

18.2.7 IQueryCache

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以上であるすべてのエントリのキーを効率よく問い合せるコードを示しています。

例18-6 特定の値に関するキーの問合せ

IValueExtractor extractor = new ReflectionExtractor("getAge");

cache.AddIndex(extractor, true, null);
ICollection keys = cache.GetKeys(new GreaterEqualsFilter(extractor, 55));

18.2.8 QueryRecorder

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);

18.2.9 IObservableCache

IObservableCacheインタフェースは、キャッシュの内容が変更されたときにアプリケーションがイベントを受信できるようにします。変更イベントに関心があることを登録するには、そのキャッシュに対するListener実装をアプリケーションで追加します。対象キャッシュでは、イベント・タイプ(挿入、更新、削除)、変更されたエントリのキー、およびエントリの古い値と新しい値などに関する情報を含むイベントが受信されます。

  • AddCacheListener(ICacheListener listener): キャッシュから発行されたすべてのイベント(挿入、更新、削除)を、そのキー、古い値および新しい値を含めて受信する標準のキャッシュ・リスナーを追加します。

  • RemoveCacheListener(ICacheListener listener): 以前に登録した標準のキャッシュ・リスナーを削除します。

  • AddCacheListener(ICacheListener listener, object key, bool isLite): 特定のキーに関するキャッシュ・リスナーを追加します。isLitetrueである場合は、イベントに古い値と新しい値が含まれないことがあります。

  • 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-8 削除されたオブジェクトに対するフィルタリング

new CacheEventFilter(CacheEventMask.Deleted);

例18-9では、EmployeeオブジェクトのLastNameプロパティがSmithから変更されると、フィルタthattrueになります。

例18-9 変更されたオブジェクトに対するフィルタリング

new CacheEventFilter(CacheEventMask.UpdatedLeft, new EqualsFilter("LastName", "Smith"));

18.2.9.1 キャッシュ・イベントへの応答

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);
    ...
}

AddRowUpdateRowおよび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、およびキャッシュされたエントリのKeyNewValueOldValueをカプセル化します。

18.2.10 IInvocableCache

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): 指定されたフィルタで選択されるエントリに対して集約操作を実行します。

18.2.11 フィルタ

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(大文字と小文字の区別なし)で始まるすべてのキャッシュ・エントリを取得します。

例18-15 大文字と小文字を区別する文字列値に基づいたキーの取得

OrFilter    orFilter = new OrFilter(new LikeFilter(IdentityExtractor.Instance, "%an", '\\', false), new LikeFilter(IdentityExtractor.Instance, "An%", '\\', true));
ICollection entries  = cache.GetEntries(orFilter);

18.2.12 値エクストラクタ

エクストラクタは、オブジェクトから値を抽出するために使用されます。すべてのエクストラクタは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リファレンスを参照してください。

例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と等しいすべてのキャッシュ・エントリが取得されます。

例18-17 ある文字列値に基づいたキャッシュ・エントリの取得

IValueExtractor extractor = new ReflectionExtractor("City");
IFilter         filter    = new EqualsFilter(extractor, "city1");
ICollection     entries   = cache.GetEntries(filter);

18.2.13 入力プロセッサ

入力プロセッサは、キャッシュ内のエントリ・オブジェクトに対して作動するエージェントです。

すべての入力プロセッサは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に更新します。

例18-19 ある数値に基づいたキー値の設定

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);

18.2.14 エントリ・アグリゲータ

エントリ・アグリゲータは、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);

注意:

例18-20および例18-21は簡単な例にすぎず、大量のキーやサイズがきわめて大きいキーを渡す用途には実用的ではありません。そのような用途では、GroupAggregator.CreateInstance(String, IEntryAggregator, IFilter)メソッドを使用してAlwaysFilterオブジェクトを渡します。

キャッシュした値オブジェクト同様、IFilterIExtractorIProcessorおよびIAggregatorのすべてのカスタム実装クラスは、.NETアプリケーションのPOFコンテキストおよびクライアントが接続されているクラスタ側ノードのPOFコンテキストに正しく登録する必要があります。したがって、カスタムの.NET型の対応するJava実装を、クラスタ側ノードで作成、コンパイルおよびデプロイする必要があります。このようなカスタム型を実際に実行するのは、.NETの実装ではなくJavaの実装であることに注意してください。

詳細は、第17章「統合オブジェクトの構築(.NET)」を参照してください。