Oracle CoherenceにおけるPortable Object Format注釈の使用方法

概要

    目的

    シリアライズまたはマーシャリングは、オブジェクトをバイナリ形式にエンコードするプロセスです。 これは、Oracle Coherenceで機能する重要なコンポーネントです。


    Portable Object Format(POF)は言語に依存しないバイナリ形式で、領域と時間の両面で効率が向上するように設計されており、Oracle Coherenceの使用時に不可欠なものとなっています。 Oracle Coherence 3.7では、POF注釈の概念を取り入れたことで、複雑なコーディングを行わずに、シンプルなオブジェクトによるPOFシリアライズのサポートが可能になりました。

    所要時間

    約45分

    はじめに

    Oracle Coherenceの役に立つ特徴の1つは、さまざまなプラットフォーム間での相互運用性を簡単にサポートできることです。Oracle Coherenceにアクセスするコードのほとんどはクラスタ側にありJavaで記述されていますが、CoherenceクライアントはJava、.NET、またはC++で記述できます。クライアントに特別な制約はありません。 代わりに、選択した言語でコードを記述し、クライアント・ライブラリに対してコンパイルを行って実行することもできます。

    これを可能にするのが、Coherence*Extendと、Oracle Coherence Portable Object Format(POF)として知られている特別バージョンのシリアライズの2つです。 POFは、オブジェクトをバイナリ形式にシリアライズおよびバイナリ形式からデシリアライズするための、プラットフォームに依存しないメカニズムです。 POFを使用してオブジェクトはバイナリにマーシャリングされ、Coherenceキャッシュに格納されます。その後で、クライアント・アプリケーションに適した形式にアンマーシャリングされます。

    一般的に、POFには次の利点があるため、標準のJavaシリアライズではなくPOFが選択されます。

    • 言語に依存しない:POFはJava、C#、C++をサポートしています。
    • サイズが小さい:POFオブジェクトのサイズは、多くの場合、Javaでシリアライズされるオブジェクトの1/5です。
    • 高速 POFオブジェクトは、Javaの場合と比較して、1/4未満の時間でシリアライズできます。
    • バージョニングが可能 POFオブジェクトのバージョンは時間の経過とともに上がっていきますが、下位互換性は維持されます。
    • 制御が可能 開発者は、POFオブジェクトのシリアライズ方法またはデシリアライズ方法を制御できます。

    POFを使用する場合、開発者は通常、com.tangosol.io.pof.PortableObjectインタフェースを実装するためにドメイン・オブジェクトを拡張します。 このインタフェースのreadExternalメソッドとwriteExternalメソッドは、POFデータ・ストリームへのデータのマーシャリングおよびPOFデータ・ストリームからのデータのアンマーシャリングの処理を行います。 非常に複雑ということはありませんが、これらのインタフェースの実装にはさまざまな利点と欠点があります。 Oracle Coherence 3.7は、POFプロセスの簡素化に使用できる新機能として、POF注釈を提供しています。

    このチュートリアルでは、Oracle Coherence 3.7のPOF注釈を使用して、シリアライズをサポートするオブジェクトを拡張および登録する方法について説明します。

    ハードウェアとソフトウェアの要件

    • Oracle Coherence 3.7.1 - こちらからダウンロードできます。
    • Coherence ED OBEサンプル・コード - こちらからダウンロードできます。

    前提条件

    このチュートリアルを始める前に次のことを確認してください。

    • Linuxのコマンドおよびコマンドライン構文について実用的な基礎知識を有している必要があります。
    • Oracle Coherence 3.7.1がマシンにインストールされている必要があります。
    • OBEサンプル・コードをダウンロードし、解凍している必要があります このコードは、Linux上および同様のオペレーティング・システム上で実行するように設計されていますが、必要であればWindowsに適応できます。
    • Oracle Java JDKバージョン1.6.0_26以降のダウンロードとインストールが完了している必要があります。 Oracle Java JDKキットと関連製品については、こちらを参照してください。
      注:Javaのインストールは、このOBEの対象外となっています。 詳しくは、JDKのダウンロードとインストールに関するページを参照してください。
    • Java注釈の実用的な知識を有している必要があります。

    このチュートリアルを始める前に、Oracle Coherence 3.7.1と関連するサンプル・ソース・コードをダウンロードしてインストールしておく必要があります。 以下の手順では、Oracle Coherence 3.7.1のインストール・プロセスおよび適切と考えられるインストールの場所について確認します。

    注: Oracle Coherence 3.7.1のインストールがすでに完了している場合は、この手順をスキップできます。

      "ハードウェアとソフトウェアの要件"にあるリンクをクリックし、ライセンス契約書に同意してOracle Coherence 3.7.1をダウンロードします。 なお、このチュートリアルでは、ファイルのダウンロード先が/tmp/およびインストール先が/optであると仮定しています。

      コマンド・プロンプトを開いて、Oracle Coherenceがインストールされる場所にディレクトリを変更します。

      次のようなコマンドを使用して、Oracle Coherenceのzipファイルのコンテンツを解凍します。

      unzip /tmp/coherence-java-3.7.1...zip

      ファイルの正確な名前は変わることがあるので、注意してください。

      このチュートリアルでは、すべてのファイルを/opt/coherenceに解凍します。


      次のようなコマンドを使用して、OBEサンプル・コードのコンテンツを解凍します。
      unzip /tmp/POF.OBE.src.zip


Portable Object Format注釈を使用したクラスの変更によるシリアライズのサポート

    注釈

    Oracle CoherenceのPOFは、注釈の概念に基づいています。 注釈とは、次のようなものです。

    • "JSR 175: Javaプログラミング言語のメタデータ機能"に基づいており、Java 5で導入されました。
    • 定型挿入文の動作と特性を定義するために、クラスに追加されます。
    • インタフェースを介して定義され、@Characteristic class {...}構文を使用してクラスに適用されます。

    次に例を示します。

    定義例
    public interface Animal { String type; }
    使用例
    @Animal(type="mammal") public class Bird {. . .}

    POFをサポートするために、com.tangosol.io.pof.annotationパッケージにあるPortable注釈とPortableProperty注釈を使用してエンティティ・クラスに注釈を付けます。

    Portableは、次のように定義されます。
      package com.tangosol.io.pof.annotation;
      @Target(value=TYPE)
      @Retention(value=RUNTIME)
      public interface Portable extends Annotation {}

    これはタイプ(@Target (value = TYPE))の全体に適用され、それらのタイプがPOFを使用してシリアライズされる必要があることを示します。
    Portable注釈について、詳しくはこちらをクリックしてください。

    PortablePropertyは、次のように定義されます。
      package com.tangosol.io.pof.annotation;
      @Target(value={FIELD,METHOD})
      @Retention(value=RUNTIME)
      public interface PortableProperty extends Annotation {
      public abstract int value();
      public abstract Class codec();
      }

    PortablePropertyはフィールドまたはメソッドに適用され、値またはコーデック属性を指定します。 値の属性は、フィールドの識別にどのインデックス値が使用されるかを示します。
    PortableProperty注釈について、詳しくはこちらをクリックしてください。

    環境の設定

      POFのテストを簡素化するために、さまざまなスクリプトが提供されてきました。 これらのスクリプトは、特定の環境変数の設定に依存しています。 これらの変数には適切なデフォルト値が割り当てられているので、それらが正しい値であれば、デフォルト値を変更する必要はありません。

      スクリプトでは、次のことが前提条件となっています。
      • Oracle Coherenceが、/opt/coherenceにインストールされている必要があります。
      • OBEソースが、/opt/POF.OBEに解凍されている必要があります。

      これらのディレクトリのどちらかが異なる場合は、次の手順を実行してください。

      コマンド・プロンプト・ウィンドウで、OBEソースが解凍されたディレクトリにいることを確認します。

      cd /opt/{obe source directory}

      テキスト・エディタで、bin/set-env.shスクリプトを開きます。

      gedit bin/set-env.sh

      先頭の近くに、OBEソースとOracle Coherenceの場所を指定する2つのexport文があります。
      2つの変数を非コメント化し、使用中の環境に適した値に設定します。

      注: デフォルト値の/opt/coherence/opt/POF.OBEを使用する場合は、変更は不要です。

      #!/bin/bash

      export OBE_HOME=/opt/my.pof.obe.location
      export COH_HOME=/opt/my.coherence.location

      変更を保存して、エディタを終了します。

    標準クラスのサイズおよびシリアライズのパフォーマンスに関するテスト


      このチュートリアルでは、シリアライズとデシリアライズの例として使用される、次の2つのエンティティ・オブジェクト・クラスをサンプルとして提供しています。

      • example.entity.Person.java 人物を表し、名前、性別、年齢、住所などの特徴を定義します。
      • example.entity.Address.java 住所を表し、番地、市町村、都道府県が含まれます。

      これら2つのクラスは、デフォルトでJava Serializableを実装し、変更をしなくてもOracle Coherenceキャッシュで使用できます。 ただし、どちらのクラスも、POFシリアライズをサポートするために、POF注釈を使用して簡単に変更できます。


      また、シリアライズされたデータの速度とサイズをテストするために使用できる次の2つのクラスも提供されています。
      • example.entity.test.TestPerson.java2つのエンティティ・クラスのインスタンスを作成し、com.tangosol.utilパッケージ・クラスを使用してシリアライズを実行します。
      • example.entity.test.TestPersonPOF.javaTestPersonと同じですが、シリアライズされるエンティティがPOF注釈をサポートすることが前提条件となっています。
      これら2つのクラスは、シリアライズ処理に関する速度情報とサイズ情報を返すために使用されます。
      コマンド・プロンプトを開いて、ディレクトリをOBEソースが解凍されたディレクトリに変更します.

      bin/run.shコマンドを使用して、どちらかのテスト・クラスを実行します。 このスクリプトは、単純に正しいクラスパスを設定して、提供されたJavaクラスを実行します。

      bin/run.sh example.entity.test.TestPerson


      テストの実行結果を検証します。 シリアライズされたオブジェクトのサイズ、およびオブジェクトのシリアライズとデシリアライズにかかった時間を確認してください。 これらの値は、後で比較のために使用します。


    オプション: テスト・ソースの検証

      エンティティ・オブジェクトのテストに使用されるTestPerson.javaクラスとTestPersonPOF.javaクラスは、シリアライズをテストするためにいくつかの興味深いクラスを使用します。 パッケージとクラスには、次のものが含まれています。

      • com.tangosol.io.pof.PofAnnotationSerializer: これらのオブジェクトをOracle Coherenceでシリアライズする方法を指定します。
      • com.tangosol.util.ExternalizableHelper: シリアライズ形式と非シリアライズ形式の間で、双方向の変換を行います。
      • com.tangosol.util.Base: シリアライズされたデータに対して、基本的なサイズ指定情報と書式設定サービスを提供します。
      テスト・アプリケーションのコードを検証します(オプション)。

      OBEソース・ツリーのルートに移動したと仮定して、どちらかのソースまたは両方のソースを開きます。

      gedit src/java/example/entity/test/TestPerson.java src/java/example/entity/test/TestPersonPOF.java




      赤色の枠は、検証の対象となる各メソッドを示しています。

    クラスの変更によるPOF注釈のサポート

      Personクラスを開きます。 このOBEで使用されるすべてのクラスのソースが、src/javaサブディレクトリにあることに注意してください。

      gedit src/java/example/entity/Person.java
      クラスに変更を加えて、クラスレベルの@Portable注釈を指定するようにします。

      クラスに注釈を付けることで、クラスが@Portable注釈を指定するようにします。 さらに、com.tansosol.io.pof.annotationパッケージにある注釈の両方にimportを追加します。

      操作が完了すると、更新されたソースは次のようになります。


      @PortableProperty注釈を使用して、クラス変数に注釈を付けます。
      Portableプロパティでは、各プロパティに対してインデックスを提供する必要があります。 プロパティ・インデックスを昇順で割り当てます。 一時フィールドには注釈を付けないように注意してください。


      変更を保存します。
      同じように、Addressクラスを開いて更新します。

      gedit src/java/example/entity/Address.java


      操作が完了すると、更新されたソースは次のようになります。
      変更を保存して、エディタを終了します。

    POF注釈のテスト

      bin/build.shスクリプトを使用して、ソースを再構築します。 エラーがあれば修正します。
      $ bin/build.sh

      テスト・アプリケーションのPOFバージョンを実行します。

      bin/run.sh example.entity.test.TestPersonPOF

      結果は次のように表示されます。


      オブジェクトのサイズが大幅に縮小され、シリアライズの速度が向上していることを確認してください。


Oracle Coherenceの構成によるPOFシリアライズのサポート

    前の項では、POFシリアライズをサポートするために、POF注釈を使用してエンティティ・オブジェクトを変更しました。 この項では、POF注釈を完全に理解するために、Oracle Coherenceを構成してPOFをシリアライズ・メカニズムとして使用するようにします。 POFシリアライズを使用するために、次のタスクを実行します。

    • POF構成ファイルを作成して、移入を行います。
    • Oracle Coherenceを構成して、新しく作成されたPOF構成を使用するようにします。

    POF構成ファイルの作成

      POF構成ファイルは、エンティティ・オブジェクトのIDとマッピングを定義するXMLファイルであるため、Oracle Coherenceで管理できます。

      POFをサポートするエンティティ・オブジェクトは、通常、POF構成ファイルのuser-types要素に含まれる1つ以上のuser-type要素によって指定されます。
      user-type要素には、2つの必須の下位要素と、その他のオプション要素を指定します。 必須の下位要素とは、次の2つです。
      • type-id 開発者割当ての整数ID(1000以上)です。1000以下は、Oracle Coherence用に予約されていることに注意してください。
      • class-name ポータブル・オブジェクト・インタフェースを実装するJavaクラスの完全修飾名は、クラスパスで使用できる必要があります。
      • 例は、次のようになります。
        <user-types>
            <user-type>
               <type-id>
        1001</type-id>
               <class-name>com...MyEntityImplementingPOF</class-name>
            </user-type>

            . . .
        </user-types>

      コマンド・プロンプト・ウィンドウで、ソースのPOF構成を構成ディレクトリにコピーします。

      cp src/config/pof-configuration.xml config/.


      テキスト・エディタでファイルを開きます。

      gedit config/pof-configuration.xml

      user-type要素を追加します。
      次のコメントがある場所を確認します。
      <!--
               Enter user defined types below this comment.
               User types must be above 1000
      -->

      このコメントの直後に、user-type要素を追加します。
      新しく追加された要素は、次のように表示されます。
      <!--
               Enter user defined types below this comment.
               User types must be above 1000
      -->
       <user-type>
      <user-type>
      IDとして1001を追加し、またクラス名としてexample.entity.Personを追加して、エントリを入力します。

      追加したエントリは、次のようになります。

      <user-type>
          <type-id>1001</type-id>
          <class-name>example.entity.Person</class-name>
      <user-type>


      example.entity.Addressクラスの2番目のuser-type要素を追加します。
      入力された2つの要素は、この時点では次のように表示されます。
      <user-type>
          <type-id>1001</type-id>
          <class-name>example.entity.Person</class-name>
      </user-type>
      <user-type>
         <type-id>1002</type-id>
          <class-name>example.entity.Address</class-name>
      </user-type>

      変更を保存して、エディタを終了します。

    POF構成ファイルの指定とPOFの有効化

      POF構成を指定する方法は、2つあります。 それぞれの方法に、利点と欠点があります。 利用可能な方法は、以下の2つです。
      • クラスパスの使用: POF構成ファイルを指定するもっとも簡単な方法は、ファイルをpof-config.xmlという名前で作成してクラスパスに配置することです。 POF構成デプロイメント・ディスクリプタ・ファイルのpof-config.xmlは、シリアライズのためにPortable Object Format(POF)を使用する場合に、カスタム・ユーザー・タイプを指定するために使用されます。 実行時に、Oracle Coherenceは、クラスパスで見つかったpof-config.xmlの最初のインスタンスを使用します。

      • システム・オーバーライドの使用: -Dtangosol.pof.config={pof-file-name}。 システム・オーバーライドを使用する際には、クラスパスによってファイルを見つける場合はファイル名のみを指定する必要があり、完全修飾名でファイルを見つける場合はファイルへの完全なパスとファイル名を指定する必要があります。
     
        注: どちらの場合でも、オーバーライド・ファイルまたはシステム・プロパティのいずれかによってPOFを有効化する必要があります。
        POFは、-Dtangosol.pof.enabled=trueを使用して有効化できます。

      POF構成ファイルの名前を変更します。

      コマンド・プロンプトで、OBEソースのルートにいることを確認します。 次に、POF構成ファイルの名前を変更します。

      $ PWD
      /opt/POF.OBE
      $ mv config/pof-configuration.xml config/pof-config.xml


      テキスト・エディタで、bin/start-server.shスクリプトを開きます。

      gedit bin/start-server.sh

      SYS_OPTセクションの場所を確認します。

      次に示すように、wka=localhostで終わる行の直後に新しい行を追加します。

      SYS_OPT="$SYS_OPT -Dtangosol.pof.enabled=true"

      更新されたスクリプトは、次のように表示されます。


      変更を保存して、エディタを終了します。

    POF構成のテスト

      Coherenceサーバーを起動します。

      bin/start-server.sh > server.log 2>&1 &

      tailを使用して、サーバーが正しく起動したことを確認します。

      tail -f server.log

      Started DefaultCacheServer...の表示によってサーバーの起動が確認されるまで、待機します。 確認が完了した後は、tailを終了します。
      grepを使用して、POF構成がロードされたことを確認します。

      grep -i pof-config server.log

      結果は次のように表示されます。

      シミュレーションを開始します。
      Oracle Coherenceとやり取りを行う簡単なシミュレーション・アプリケーションが提供されています。このアプリケーションは、エンティティの追加、エンティティへのアクセス、あるいはキャッシュの操作を実行します。
      提供されているスクリプトは、多数のエントリを生成するシミュレーション・インスタンスをいくつか起動します。 これらのエントリにアクセスして終了してください。
      シミュレーションの実行には2分かかり、2分経過すると自動的に終了します。

      bin/start-sim.sh


      シミュレーションを開始した後、約30秒間待機してから、シミュレーション・ログを検証します。 tailコマンドは、シミュレーションの進捗状況を監視するのに役立ちます。

      tail -f sim.logs/sim.0.log

      Coherenceキャッシュに、個人のエンティティが一定間隔で追加されていくのが分かります。
      POFの成果物に対応するシミュレーション・ログを検索します。

      grep -i pof.config sim.logs/*.log

      Coherenceサーバーを停止します。
      2分が経過すると、シミュレーションは自動的に終了します。 jobsコマンドを使用してCoherenceサーバーのジョブIDを確認し、killコマンドを使用してインスタンスを停止します。



まとめ

    このチュートリアルで学習した内容は、次のとおりです。

    • Portable Object Format(POF)注釈とは何か
    • POF注釈をJavaエンティティ・クラスで使用する方法
    • POF注釈を実装するクラスをテストする方法
    • シリアライズのためにPOFを使用するようにOracle Coherenceを構成する方法

    参考資料

    • Oracle Coherence 3.7.1ドキュメント(ここをクリック)
    • Oracle Coherenceの開発と管理に関するOracle Universityの各種クラス(および上級者向けトレーニング)は、ここから検索可能
    • Oracle Learning Libraryにある追加のOBE

    著者

    • Lead Curriculum Developer: Al Saganich
    • 共著者: Jason Howes、Tim Middleton、Noah Arliss他

このOracle by Exampleをナビゲートする際、次の機能を使用できます。

ヘッダー・ボタンの非表示:
ヘッダー内のボタンを非表示にするには、タイトルをクリックします。 ボタンを再表示するには、もう一度タイトルをクリックします。
トピック一覧ボタン:
すべてのトピックの一覧です。 いずれかのトピックをクリックすると、その項に移動します。
すべてのトピックを開く/閉じる:
すべての項の詳細を表示または非表示にします。 デフォルトでは、すべてのトピックが閉じられています。
すべてのイメージを表示/非表示:
すべてのスクリーンショットを表示または非表示にします。 デフォルトでは、すべてのイメージが表示されています。
印刷:
コンテンツを印刷します。 現在表示または非表示にされているコンテンツが印刷されます。

このチュートリアルの特定の項に移動するには、一覧からトピックを選択してください。