2 最初のExtendアプリケーションの構築

Coherenceキャッシュにアクセスして使用するシンプルなCoherence*Extendクライアントをビルドして実行します。この章で使用するクライアントの例はJavaベースのExtendクライアントですが、説明する概念はC++および.NET Extendクライアントにも共通しています。C++および.NETの完全な例は、Coherence for Javaディストリビューションの一部として配布されているCoherenceの例を参照してください。

この章の内容は次のとおりです。

Extendサンプルの概要

Coherence*Extendの例では、一連のステップを使用して基本的なCoherence*Extendクライアントを作成、構成および実行します。各ステップでは、拡張プロキシの構成、リモート・キャッシュの構成、リモート起動サービスの構成、Coherence APIの使用など、Coherence*Extendの多数の基本的な概念について説明します。

ステップを完了するには、Coherence for Javaをインストールする必要があります。わかりやすくするため、またデプロイしやすくするために、この例では、クライアントとキャッシュ・サーバーを同じコンピュータで実行します。通常は、Extendクライアントとキャッシュ・サーバーは、別々のシステムに配置されます。

ステップ1: クラスタ側の構成

この例のExtendクライアントでは、クラスタのキャッシュ構成デプロイメント・ディスクリプタで、プロキシとキャッシュを構成する必要があります。この例で構成される拡張プロキシは、プロキシ・ポートが自動的に割り当てられ、クライアントTCP/IP通信をリスニングします。dist-extendという名前の分散キャッシュを定義し、これを使用してクライアント・データをクラスタに格納します。

クラスタ側を構成するには:

  1. example-config.xmlという名前のXMLファイルを作成します。
  2. このファイルに次のXMLをコピーします。
    <?xml version="1.0"?>
    
    <cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
       xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config
       coherence-cache-config.xsd">
       <caching-scheme-mapping>
          <cache-mapping>
             <cache-name>dist-extend</cache-name>
             <scheme-name>extend</scheme-name>
          </cache-mapping>
       </caching-scheme-mapping>
    
       <caching-schemes>
          <distributed-scheme>
             <scheme-name>extend</scheme-name>
             <lease-granularity>member</lease-granularity>
             <backing-map-scheme>
                <local-scheme/>
             </backing-map-scheme>
             <autostart>true</autostart>
          </distributed-scheme>
    
          <proxy-scheme>
             <service-name>ExtendTcpCacheService</service-name>
             <autostart>true</autostart>
          </proxy-scheme>
       </caching-schemes>
    </cache-config>
    
  3. ファイルを保存して閉じます。

ステップ2: クライアント側の構成

例のクライアントはリモート・キャッシュに問い合せ、リモート・クラスタ・ノードで実行されるタスクの起動も行います。これらの操作を完了するために、この例のExtendクライアントに、リモート・キャッシュ・スキームとリモート起動スキームが必要です。タスクの起動は応用例と見なされます。

リモート・キャッシュ・スキームには、クライアントの接続先のクラスタ上にあるプロキシ・サービスのサービス名と一致するサービス名が含まれます。さらに、クラスタで使用されるキャッシュ名もリモート・キャッシュ・スキームの名前として使用する必要があります。この例(ステップ1に基づく)では、リモート・キャッシュ・スキームのサービス名はExtendTcpCacheServiceで、キャッシュ名はdist-extendです。最後に、リモート・キャッシュ・スキームには、クラスタのネーム・サービスのアドレスとポートが含まれ、これらはプロキシの検出に使用されます。ネーム・サービスは、デフォルトで7574のクラスタ・ポート上で実行されます。

この例のExtendクライアントはリモート・キャッシュのタスクを起動するため、リモート起動スキームが必要です。リモート起動スキームはExtendTcpInvocationServiceサービスを定義し、これによってクライアントはInvocableインスタンスを作成して、それを処理のためにクラスタに送信できます。リモート起動スキームでは、ネーム・サービスを使用してプロキシを検出し、接続先のプロキシ・サービスの名前が含まれます。

クライアント側を構成するには:

  1. example-client-config.xmlという名前のXMLファイルを作成します。
  2. このファイルに次のXMLをコピーします。
    <?xml version="1.0"?>
    
    <cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
       xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config
       coherence-cache-config.xsd">
       <caching-scheme-mapping>
          <cache-mapping>
             <cache-name>dist-extend</cache-name>
             <scheme-name>remote</scheme-name>
          </cache-mapping>
       </caching-scheme-mapping>
      
       <caching-schemes>
          <remote-cache-scheme>
             <scheme-name>remote</scheme-name>
             <service-name>ExtendTcpCacheService</service-name>
             <initiator-config>
                <tcp-initiator>
                   <name-service-addresses>
                      <socket-address>
                         <address>127.0.0.1</address>
                         <port>7574</port>
                      </socket-address>
                   </name-service-addresses>
                </tcp-initiator>
                <outgoing-message-handler>
                   <request-timeout>5s</request-timeout>
                </outgoing-message-handler>
             </initiator-config>
          </remote-cache-scheme>
     
          <remote-invocation-scheme>
             <scheme-name>extend-invocation</scheme-name>
             <service-name>ExtendTcpInvocationService</service-name>
             <proxy-service-name>ExtendTcpCacheService</proxy-service-name>
             <initiator-config>
                <tcp-initiator>
                   <name-service-addresses>
                      <socket-address>
                         <address>127.0.0.1</address>
                         <port>7574</port>
                      </socket-address>
                   </name-service-addresses>
                </tcp-initiator>
                <outgoing-message-handler>
                   <request-timeout>5s</request-timeout>
                </outgoing-message-handler>
             </initiator-config>
          </remote-invocation-scheme>
       </caching-schemes>
    </cache-config>
    
  3. ファイルを保存して閉じます。

ステップ3: サンプル・クライアントの作成

この例のクライアント・アプリケーションは、CacheServiceを使用してリモート・キャッシュ内のInteger値を増分してから、InvocationServiceを使用してキャッシュから値を取得する、シンプルなクライアントです。クライアントはシステム出力に値を書き込んでから終了します。

ノート:

  • クライアント・クラスは、クラスタ内のすべてのキャッシュ・サーバーのクラスパス上にある必要があります。TestClient$1クラスは、コンパイル中に生成される匿名の内部クラスです。これはシリアライズ化されて、クラスタ・メンバー上で実行されているInvocationServiceに送信されます。この例では、クライアントおよびクラスタ・メンバーが1つのコンピュータ上で実行されています。このため、両方のJava起動が同じクラスパスを使用します。

  • この例は、Coherenceノード(つまりクラスタ内)でもそのまま実行できます。TCP/IPを介してリモート・クラスタ・ノードに送信される操作は、クライアント・アプリケーションに対して完全に透過的になります。

サンプル・アプリケーションを作成するには:

  1. テキスト・ファイルを作成します。
  2. このファイルに次のJavaコードをコピーします。
    import com.tangosol.net.AbstractInvocable;
    import com.tangosol.net.CacheFactory;
    import com.tangosol.net.InvocationService;
    import com.tangosol.net.NamedCache;
    import java.util.Map;
    
    public class TestClient {
        public static void main(String[] asArgs)
                throws Throwable
            {
            NamedCache cache  = CacheFactory.getCache("dist-extend");
            Integer IValue = (Integer) cache.get("key");
            if (IValue == null)
                {
                IValue = new Integer(1);
                }
            else
                {
                IValue = new Integer(IValue.intValue() + 1);
                }
            cache.put("key", IValue);
     
            InvocationService service = (InvocationService)
                    CacheFactory.getConfigurableCacheFactory()
                        .ensureService("ExtendTcpInvocationService");
     
            Map map = service.query(new AbstractInvocable()
                {
                    public void run()
                        {
                        System.out.println("This has been run by 
                           ExtendTcpInvocationService on: " +
                           CacheFactory.getCluster().getLocalMember());
                        setResult(CacheFactory.getCache("dist-extend").get("key"));
                        }
                }, null);
     
            Integer IValue1 = (Integer) map.get(service.getCluster().
                getLocalMember());
            System.out.print("The value of the key is " + IValue1);
            }
    }
    
  3. TestClient.javaという名前でファイルを保存して閉じます。
  4. TestClient.javaをコンパイルします。
    javac -cp .;COHERENCE_HOME\lib\coherence.jar TestClient.java
    

Coherence*Extend InvocationService

当然、Coherence*Extendクライアントはクラスタやクラスタ内で実行されているメンバーを直接認識しないため、Coherence*Extend InvocationServiceInvocableタスクを実行できるのは、クライアントが接続されているJVMに対してのみです。したがって、必ずnullメンバーをquery()メソッドに設定して渡す必要があります。結果として、実行による単一の結果がローカルのMemberを使用してキー設定されます(クライアントがクラスタの一部でない場合はnullに設定されます)。このMemberは、service.getCluster().getLocalMember()をコールすることで取得できます。またCoherence*Extend InvocationServiceは、同期タスクの実行のみをサポートします(つまりexecute()メソッドはサポートされません)。

ステップ4: キャッシュ・サーバー・プロセスの開始

拡張プロキシは、キャッシュ・サーバーのプロセス(DefaultCacheServer)の一環として開始されます。キャッシュ・サーバーは、ステップ1で作成したキャッシュ構成を使用するように構成する必要があります。また、キャッシュ・サーバー・プロセスは、実行時にクラスパス上でTestClientアプリケーションを検出できる必要があります。

次のコマンド行では、キャッシュ・サーバー・プロセスが開始され、coherence.cacheconfigシステム・プロパティを使用して、ステップ1で作成したキャッシュ構成ファイルに明示的に名前が付けられます。

java -cp COHERENCE_HOME\lib\coherence.jar;PATH_TO_CLIENT -Dcoherence.cacheconfig=PATH\example-config.xml com.tangosol.net.DefaultCacheServer

コンソール出力をチェックして、プロキシ・サービスが開始されていることを確認します。出力メッセージは次のようになります。

(thread=Proxy:ExtendTcpProxyService:TcpAcceptor, member=1): TcpAcceptor now
 listening for connections on 192.168.1.5:7077

ステップ5: アプリケーションの実行

TestClientアプリケーションはjavaコマンドを使用して起動し、キャッシュ構成ファイルを使用するように構成する必要があります。

次のコマンド行でアプリケーションを実行します。ここでは、TestClientクラスが現在のディレクトリに配置されていると想定しています。キャッシュ構成ファイルは、coherence.cacheconfigシステム・プロパティを使用して明示的に名前が付けられます。

java -cp .;COHERENCE_HOME\lib\coherence.jar -Dcoherence.cacheconfig=PATH\example-client-config.xml TestClient

出力には、クライアントが拡張プロキシのTCPアドレスに正常に接続したことやキャッシュ内のキーの現在の値などが表示されます。クライアントを再度実行すると、キーの値が増分します。

ノート:

キャッシュ・サーバー・プロセスの出力に、起動タスクがExtendTcpInvocationServiceサービスを使用してリモートに実行されたことを確認するメッセージがあるか調べます。

This has been run...