Invocableは任意のアクションを実行でき、作業を行うために必要な任意のクラスタ側サービス(キャッシュ・サービスやグリッド・サービスなど)を使用できます。Invocableの操作はステートフルにすることもできます。つまり、その状態がシリアライズされ、Invocableが実行されるグリッド・ノードに転送されます。
Coherence for C++では、クライアントが接続されているクラスタ側JVM内でのInvocableの実行を可能にするリモート起動サービスを提供しています。JavaでのInvocableは、com.tangosol.net.Invocableインタフェースを実装する単純な実行可能アプリケーション・クラスです。Coherence for C++でInvocableを採用するには、InvocableのC++実装であるcoherence::net::Invocableを提供するほかに、InvocableタスクのコンパイルされたJava実装をクラスタ側ノードにデプロイする必要があります。実行はサーバー側(つまりJava)で行われるため、C++のInvocableは状態にのみ関係します。メソッド自体はno-op(無操作)になっている場合があります。
リモート起動サービスは、キャッシュ・コンフィギュレーション・ディスクリプタのremote-invocation-scheme要素を使用して構成します。例11-1は、リモート起動スキーム・コンフィギュレーションのサンプルを示しています。
例11-1 リモート起動スキーム・コンフィギュレーションのサンプル
<remote-invocation-scheme>
<scheme-name>example-invocation</scheme-name>
<service-name>ExtendTcpInvocationService</service-name>
<initiator-config>
<tcp-initiator>
<remote-addresses>
<socket-address>
<address>localhost</address>
<port>9099</port>
</socket-address>
</remote-addresses>
</tcp-initiator>
<outgoing-message-handler>
<request-timeout>30s</request-timeout>
</outgoing-message-handler>
</initiator-config>
</remote-invocation-scheme>
coherence::net::CacheFactoryクラスを使用することによって、構成済リモート起動サービスへの参照を名前によって取得できます。
例11-2 リモート起動サービスへの参照
InvocationService::Handle hService = hService::getService("ExtendTcpInvocationService");
クライアントが接続されているグリッド・ノードでエージェントを実行するために必要なコードは、次の1行のみです。
Map::View hResult = hService->query(myTask::create(), NULL);
問合せから返されたMapには、問合せが実行されたメンバーがキー設定されます。Extendクライアントの場合はメンバーシップの概念がないため、結果には、CacheFactory::getConfigurableCacheFactory()::GetLocalMember()をコールして取得されるローカル・メンバーがキー設定されます。