この章では、Coherence for C++の設定、Coherence*Extendの統合およびログ出力の構成の一般的な手順について説明します。
Coherence for C++を構成して使用するには、次の7つの基本的な手順が必要です。
Coherence for C++ APIを使用してC++アプリケーションを実装します。APIの詳細は、第5章「Coherence for C++ APIについて」を参照してください。
アプリケーションをコンパイルおよびリンクします。
パスを構成します。
クライアント、およびクラスタにある1つ以上のJVMの両方にCoherence*Extendを構成します。
クライアント、およびクラスタの中でCoherence*Extendのクラスタ・サービスを実行しているすべてのJVMにPOFコンテキストを構成します。
Coherenceクラスタが稼働中であることを確認します。
C++クライアント・アプリケーションを起動します。
これらの手順の詳細は、次の各項で説明します。
Coherence for C++に用意されているAPIを使用すると、データ、データ・イベント、データ処理などのCoherenceクラスタ・サービスに、Coherenceクラスタ外部からC++アプリケーションを使用してアクセスできます。
Coherence for C++ APIは、次のもので構成されています。
一連のC++パブリック・ヘッダー・ファイル
サポートされているすべてのC++コンパイラでビルドした、各バージョンの静的ライブラリ
いくつかのサンプル
このライブラリを使用したC++アプリケーションは、Coherenceクラスタ内で稼働するCoherence*Extendのクラスタ・サービス・インスタンスに、高性能なTCP/IPベースの通信レイヤーを使用して接続できます。このライブラリからCoherence*Extendクラスタ・サービスにすべてのクライアント・リクエストが送信され、このサービスは実際のCoherenceクラスタ・サービス(パーティション・キャッシュ・サービス、レプリケーション・キャッシュ・サービスなど)に委任することで、クライアント・リクエストに応答します。
第5章「Coherence for C++ APIについて」では、このAPIにある主要なクラスの概要を説明しています。これらのクラスの詳細は、Coherence for C++のdocディレクトリにあるAPIそのものを参照してください。
Coherence for C++を採用したアプリケーションをコンパイルできるプラットフォームのリストは、サポートされているプラットフォームとオペレーティング・システムに関するトピックを参照してください。
たとえば、次に示すWindows 32ビット・プラットフォーム用build.cmdファイルは、Coherence for C++のデモのファイルをビルド、コンパイルおよびリンクします。このファイルにある各変数の意味は次のとおりです。
OPTおよびLOPTは、コンパイラのオプションをポイントします。
INCは、includeディレクトリにあるCoherence for C++ APIのファイルをポイントします。
SRCは、commonディレクトリにあるC++のヘッダー・ファイルとコード・ファイルをポイントします。
OUTは、コードのコンパイルが完了したときにコンパイラやリンカーで生成する必要のあるファイルをポイントします。
LIBPATHは、libraryディレクトリをポイントします。
LIBSは、Coherence for C++の共有ライブラリ・ファイルをポイントします。
このファイルは、これらの環境変数を設定した後、C++のコード・ファイルとヘッダー・ファイル、APIファイルおよびOPTファイルをコンパイルし、LOPT、Coherence for C++の共有ライブラリ、生成されたオブジェクト・ファイルおよびOUTファイルをリンクします。オブジェクト・ファイルを削除することで、この処理は終了します。build.cmdファイルの実行例を例4-1に示します。
例4-1 build.cmdファイルの実行例
@echo off setlocal set EXAMPLE=%1% if "%EXAMPLE%"=="" ( echo You must supply the name of an example to build. goto exit ) set OPT=/c /nologo /EHsc /Zi /RTC1 /MD /GR /DWIN32 set LOPT=/NOLOGO /SUBSYSTEM:CONSOLE /INCREMENTAL:NO set INC=/I%EXAMPLE% /Icommon /I..\include set SRC=%EXAMPLE%\*.cpp common\*.cpp set OUT=%EXAMPLE%\%EXAMPLE%.exe set LIBPATH=..\lib set LIBS=%LIBPATH%\coherence.lib echo building %OUT% ... cl %OPT% %INC% %SRC% link %LOPT% %LIBS% *.obj /OUT:%OUT% del *.obj echo To run this example execute 'run %EXAMPLE%' :exit
Coherence for C++ライブラリへのコンフィギュレーション・パスを設定します。この手順では、ライブラリをポイントする環境変数を設定します。環境変数名とライブラリのファイル名は、使用しているプラットフォーム環境によって異なります。プラットフォームごとの環境変数名とライブラリ名の一覧は、「コンパイルとリンクの環境変数の設定」を参照してください。
Coherence*Extendを構成するには、クラスタ側とクライアント側両方のキャッシュ・コンフィギュレーション・ディスクリプタに適切な構成要素を追加します。クラスタ側のキャッシュ・コンフィギュレーション要素からCoherenceのDefaultCacheServerに対して、Coherence*Extendクライアントから受信したTCP/IPリクエストをリスニングするCoherence*Extendクラスタ・サービスを開始するように指示されます。クライアント側のキャッシュ・コンフィギュレーション要素は、クライアント・ライブラリによって、クラスタに接続するために使用されます。この構成では、クラスタの中でCoherence*Extendのクラスタ・サービスを実行している1台以上のサーバーのIPアドレスとポートを指定します。これにより、ライブラリをクラスタに接続できます。この構成では、接続やリクエストのタイムアウトなど、接続に関連する様々なパラメータも記述します。
Coherence*ExtendクライアントをCoherenceクラスタに接続するには、そのクラスタにある1つ以上のDefaultCacheServer JVMで、TCP/IP Coherence*Extendクラスタ・サービスを実行している必要があります。このサービスを実行するようにDefaultCacheServerを構成するには、そのDefaultCacheServerで使用するキャッシュ・コンフィギュレーション・ディスクリプタに、子にtcp-acceptor要素を持つproxy-scheme要素を追加する必要があります。
たとえば、例4-2のキャッシュ・コンフィギュレーション・ディスクリプタは、2つのクラスタ・サービスを定義します。これは、リモートCoherence*ExtendクライアントをTCP/IPでCoherenceクラスタに接続できるようにするサービス、および標準のパーティション・キャッシュ・サービスです。このディスクリプタはDefaultCacheServerで使用しているため、クラスタ・サービスの終了時に自動的に再起動するように、各サービスのautostart構成要素をtrueに設定しておくことが重要です。proxy-scheme要素には、tcp-acceptorという子要素があり、この子要素には、TCP/IPを介してクライアント接続リクエストを受け入れるために必要なTCP/IP固有の情報がすべて含まれます。acceptor-configも、そのシリアライザ用にConfigurablePofContextを使用するように構成されています。C++ Extendのクライアントでは、シリアライズにPOFを使用する必要があります。
シリアライズとPIF/POFの詳細は、第3章「C++クライアントの統合オブジェクトの構築」を参照してください。
次のように構成されたCoherence*Extendのクラスタ・サービスは、localhostアドレスとport 9099で、受信リクエストをリスニングします。たとえば、dist-extendというCoherenceキャッシュにクライアントが接続しようとすると、Coherence*Extendのクラスタ・サービスがNamedCacheへの後続リクエストを同じ名前で代行します。その名前は、この例ではパーティション・キャッシュとなります。
例4-2 2つのクラスタ・サービスのキャッシュ・コンフィギュレーション
<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>dist-*</cache-name>
<scheme-name>dist-default</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<distributed-scheme>
<scheme-name>dist-default</scheme-name>
<lease-granularity>member</lease-granularity>
<backing-map-scheme>
<local-scheme/>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
<proxy-scheme>
<service-name>ExtendTcpProxyService</service-name>
<thread-count>5</thread-count>
<acceptor-config>
<tcp-acceptor>
<local-address>
<address>localhost</address>
<port>9099</port>
</local-address>
</tcp-acceptor>
<serializer>
<class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
</serializer>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
</caching-schemes>
</cache-config>
Coherence*Extendのクライアントの構成にある主要な要素はcache-configです。この要素には、キャッシュ・コンフィギュレーションを含むキャッシュ・コンフィギュレーション・ディスクリプタのパスを記述します。このキャッシュ・コンフィギュレーション・ディスクリプタは、DefaultConfigurableCacheFactoryで使用されます。
Coherence*Extendクライアントでは、Coherenceクラスタ内で実行されるCoherence*Extendクラスタ・サービスへの接続およびCoherence*Extendクラスタ・サービスとの通信に、キャッシュ・コンフィギュレーション・ディスクリプタの要素initiator-config内の情報が使用されます。
たとえば、例4-3のキャッシュ・コンフィギュレーション・ディスクリプタは、リモートCoherenceクラスタに接続するキャッシング・スキームを定義します。remote-cache-scheme要素には、tcp-initiatorという子要素があり、この子要素には、リモートCoherenceクラスタ内でCoherence*Extendクラスタ・サービスが実行されているクライアントへの接続に必要なTCP/IP固有の情報がすべて含まれます。
クライアント・アプリケーションで、たとえばdist-extendという名前を使用してCacheFactoryで名前付きキャッシュを取得すると、Coherence*Extendクライアントは(アドレスlocalhostとport 9099による)TCP/IPを使用してCoherenceクラスタに接続し、NamedCache実装を返します。この実装は、リモート・クラスタの中で実行している同名のNamedCacheにリクエストをルーティングする機能を持っています。remote-addresses構成要素には、子要素socket-addressを複数記述できます。Coherence*Extendのクライアントは、記載されたアドレスをすべて試すか、またはTCP/IP接続が確立されるまで、アドレスへの接続をランダムに試行します。
例4-3 リモートCoherenceクラスタに接続するキャッシング・スキーム
<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>local-*</cache-name>
<scheme-name>local-example</scheme-name>
</cache-mapping>
<cache-mapping>
<cache-name>dist-extend</cache-name>
<scheme-name>extend-dist</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<local-scheme>
<scheme-name>local-example</scheme-name>
</local-scheme>
<remote-cache-scheme>
<scheme-name>extend-dist</scheme-name>
<service-name>ExtendTcpCacheService</service-name>
<initiator-config>
<tcp-initiator>
<remote-addresses>
<socket-address>
<address system-property="tangosol.coherence.proxy.address">localhost</address>
<port system-property="tangosol.coherence.proxy.port">9099</port>
</socket-address>
</remote-addresses>
<connect-timeout>10s</connect-timeout>
</tcp-initiator>
<outgoing-message-handler>
<request-timeout>5s</request-timeout>
</outgoing-message-handler>
</initiator-config>
</remote-cache-scheme>
</caching-schemes>
</cache-config>
(ネットワーク、ソフトウェア、ハードウェアなどの障害によって)クライアントとクラスタ間の接続が切断されたことをCoherence*Extendのクライアント・サービスが検出すると、このCoherence*Extendのクライアント・サービスの実装(CacheServiceまたはInvocationService)によって(MemberEventHandlerデリゲートを使用して)MemberEventType.Leftイベントが発生し、このクライアント・サービスは停止します。クライアント・アプリケーションがその後もこのサービスを使用しようとする場合には、サービス自体が自動的に再起動してクラスタへの再接続を試行します。このサービスが接続に成功するとMemberEventType.Joinedイベントが発生し、接続に失敗するとクライアント・アプリケーションに致命的な例外がスローされます。
Coherence*Extendサービスには、接続の切断を検出するためのメカニズムがいくつか用意されています。その中には、(Extend-TCPのTCP/IPのように)基底プロトコルに固有のものもあれば、サービス自体に実装されるものもあります。後者のメカニズムは、outgoing-message-handler構成要素を使用して構成されます。
接続の切断を検出するためにCoherence*Extendのクライアント・サービスで使用される構成可能な主要メカニズムは、リクエストのタイムアウトです。サービスがリモート・クラスタにリクエストを送信したが、リクエストのタイムアウト時間内にレスポンスを受信しなかった場合(<request-timeout>を参照)、サービスでは接続が切断されたと想定されます。Coherence*Extendのクライアント・サービスおよびクラスタ・サービスは、接続を介して定期的にハートビートを送信するように構成することもできます(<heartbeat-interval>と<heartbeat-timeout>を参照)。構成されたハートビートのタイムアウト時間内にサービスがレスポンスを受信しなかった場合、サービスでは接続が切断されたと想定されます。
C++アプリケーションでCoherence for C++ライブラリを使用するには、そのアプリケーションにCoherence for C++ライブラリをリンクし、Coherence for C++のキャッシュ・コンフィギュレーションと場所を指定する必要があります。
キャッシュ・コンフィギュレーション・ファイルの場所は、サンプル・アプリケーションの項で指定した環境変数、またはプログラム上の処理で設定できます。
「ランタイム・ライブラリと検索パス」の説明にあるように、tangosol.coherence.cacheconfigシステム・プロパティを使用してキャッシュ・コンフィギュレーション・ファイルの場所を指定できます。Windowsでこのコンフィギュレーション・ファイルの場所を設定するには、次のコマンドを実行します。
c:\coherence_cpp\examples> set tangosol.coherence.cacheconfig=config\extend-cache-config.xml
DefaultConfigurableCacheFactory::createとCacheFactory::configure(必要に応じてCacheFactory::loadXmlFileヘルパー・メソッドを使用)のいずれかを使用して、プログラム処理でコンフィギュレーション・ファイルの場所を設定できます。
例4-4 コンフィギュレーション・ファイルの場所の設定
static Handle coherence::net::DefaultConfigurableCacheFactory::create (String::View vsFile = String::NULL_STRING)
DefaultConfigurableCacheFactoryクラスのcreateメソッドで、新しいCoherence cacheファクトリを作成します。vsFileパラメータで、ロードするCoherenceのコンフィギュレーション・ファイルの名前と場所を指定します。
例4-5 Coherenceキャッシュ・ファクトリの作成
static void coherence::net::CacheFactory::configure (XmlElement::View vXmlCache, XmlElement::View vXmlCoherence = NULL)
configureメソッドで、CacheFactoryとローカル・メンバーを構成します。cache-config.dtdに対応するXML要素をvXmlCacheパラメータで指定し、coherence.dtdに対応するXML要素をvXmlCoherenceパラメータで指定します。
例4-6 CacheFactoryとローカル・メンバーの構成
static XmlElement::Handle coherence::net::CacheFactory::loadXmlFile (String::View vsFile)
loadXmlFileメソッドで、指定されたファイルからXmlElementを読み取ります。このメソッドでは、CacheFactoryを構成することはできませんが、configureメソッドに対して指定できる構成を取得することはできます。パラメータvsFileで、読込み元であるファイルの名前を指定します。
例4-7のC++コードでは、CacheFactory::configureメソッドを使用して、サーバー/クラスタのキャッシュ・コンフィギュレーション・ファイル(coherence-extend-config.xml)の場所およびC++クライアントのキャッシュ・コンフィギュレーション・ファイル(tangosol-operation-config.xml)の場所を設定します。
オペレーション・コンフィギュレーション・オーバーライド・ファイル(デフォルトではtangosol-coherence-override.xml)では、Oracle Coherenceで使用する操作設定とランタイム設定を制御して、そのクラスタ・サービス、通信サービスおよびデータ管理サービスを作成、構成および維持します。Javaクライアント同様、C++クライアントでもこのファイルの使用はオプションです。
C++クライアントの場合、このファイルを使用して、具体的にキャッシングに関連していないCoherenceアプリケーションの一般的な操作設定を指定するか、またはオーバーライドできます。C++クライアントの場合の主要な要素は、ロギング、Coherence製品のエディション、および特定のクラスタ・メンバーの場所とロールの割当てのためのものです。
オペレーション・コンフィギュレーションは、プログラム上の処理またはtangosol-coherence-override.xmlファイルで構成できます。プログラム上の処理でオペレーション・コンフィギュレーションを構成するには、CacheFactory::configureメソッド(coherence::net::CacheFactory::configure (View vXmlCache, View vXmlCoherence))のvXmlCoherenceパラメータに次の要素が1つ以上記述され、coherence.dtdに従ったXMLファイルを指定します。
license-config: license-config要素には、Coherenceのエディションと操作モードの構成を可能にするサブ要素を記述します。edition-nameサブ要素は、メンバーが使用する製品エディション(Grid Edition、Enterprise Edition、Real Time Clientなど)を指定します。この方法では、使用するエディションをメンバーごとに指定することで、同じクラスタの中で複数の製品エディションを使用できます。Coherence for C++クライアントの場合は、RTC(リアルタイム・クライアント)およびDC(データ・クライアント)の各値のみを認識できます。license-configは、coherence要素のオプションのサブ要素で、デフォルト値はRTCです。
logging-config: logging-config要素は、システムにメッセージのログを記録する方法の構成を可能にするサブ要素を記述します。この要素を使用して、ログ・メッセージの保存先、重大度および書式を指定できます。logging-configは、coherence要素の必須のサブ要素です。ロギングの詳細は、「Loggerの構成」を参照してください。
member-identity: member-identity要素は、クラスタ・メンバーの場所とロールの定義に役立つ詳細な識別情報を指定します。この要素を使用して、メンバーが属するクラスタ、ラック、サイト、マシン、ロールなどの名前を指定できます。member-identityは、cluster-config要素のオプションのサブ要素です。例4-8は、サンプル・ファイルtangosol-coherence.xmlの内容を示しています。
例4-8 オペレーション・コンフィギュレーションのサンプル
<?xml version='1.0'?>
<coherence>
<cluster-config>
<member-identity>
<site-name>extend site</site-name>
<rack-name>rack 1</rack-name>
<machine-name>machine 1</machine-name>
</member-identity>
</cluster-config>
<logging-config>
<destination>stderr</destination>
<severity-level>5</severity-level>
<message-format>(thread={thread}): {text}</message-format>
<character-limit>8192</character-limit>
</logging-config>
<license-config>
<edition-name>RTC</edition-name>
<license-mode>production</license-mode>
</license-config>
</coherence>
「オペレーション・コンフィギュレーションの要素」では、オペレーション・コンフィギュレーション・ファイルとそこで定義できる要素について詳しく説明しています。
Loggerは、オペレーション・コンフィギュレーション・ファイルのlogging-config要素を使用して構成します。この要素では次の属性を指定します。これらの属性では、ログに記録されたエラーに関する詳細情報を記録できます。
destination: Loggerで使用するLogOutputのタイプを指定します。有効な値は次のとおりです。
stderr(Console.Errorの場合)
stdout(Console.Outの場合)
ファイル・パス(メッセージをファイルに送信する必要がある場合)
severity-level: メッセージをログに記録するために満たすか、または超過する必要のあるログ・レベルを決定します。
message-format: ログ・メッセージの書式を決定します。
character-limit: ログ出力デーモンがメッセージ・キューから処理する文字の最大数を決定します。この数を超過すると、キューに残っているメッセージがすべて破棄されます。例4-9は、ロギングの構成を記述したオペレーション・コンフィギュレーションを示しています。オペレーション・コンフィギュレーションの詳細は、「オペレーション・コンフィギュレーション・ファイル(tangosol-coherence-override.xml)」を参照してください。
すでに説明したクラスタ側のCoherenceキャッシュ・コンフィギュレーションを使用するDefaultCacheServerを起動し、TCP/IPを使用してCoherence for C++クライアントをCoherenceクラスタに接続できるようにするには、次の手順を実行する必要があります。
現在のディレクトリをOracle Coherenceのライブラリ・ディレクトリに変更します(Windowsの場合は%COHERENCE_HOME%\lib、UNIXの場合は$COHERENCE_HOME/lib)。
Javaコマンドが実行されるようにパスを構成します。
次のコマンドラインを使用してDefaultCacheServerを起動します。