この章の内容は次のとおりです。
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-operation(操作なし)になっている場合があります。
リモート起動サービスは、キャッシュ構成ディスクリプタのremote-invocation-scheme
要素を使用して構成します。次の例は、リモート起動スキーム構成を示しています。
<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>7077</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
クラスを使用することによって、構成済リモート起動サービスへの参照を名前によって取得できます。
InvocationService::Handle hService = hService::getService("ExtendTcpInvocationService");
クライアントが接続されているグリッド・ノードでエージェントを実行するために必要なコードは、次の1行のみです。
Map::View hResult = hService->query(myTask::create(), NULL);
問合せから返されたMap
には、問合せが実行されたメンバーがキー設定されます。Extendクライアントの場合はメンバーシップの概念がないため、結果には、CacheFactory::getConfigurableCacheFactory()::GetLocalMember()
をコールして取得されるローカル・メンバーがキー設定されます。
キャッシュされた値オブジェクト同様、すべてのInvocable
実装クラスは、C++アプリケーション(「PortableObject (自己シリアライズ)」を参照)のPOFコンテキストおよびクライアントが接続されているクラスタ側ノードのPOFコンテキストに正しく登録する必要があります。したがって、Invocable
タスクのJava実装(com.tangosol.net.Invocable
実装)は、クラスタ側ノードで作成、コンパイルおよびデプロイする必要があります。
詳細は、「カスタムのC++型の登録」を参照してください。