Oracle CoherenceにおけるPortable Object Format注釈の使用方法
概要
- 言語に依存しない:POFはJava、C#、C++をサポートしています。
- サイズが小さい:POFオブジェクトのサイズは、多くの場合、Javaでシリアライズされるオブジェクトの1/5です。
- 高速: POFオブジェクトは、Javaの場合と比較して、1/4未満の時間でシリアライズできます。
- バージョニングが可能: POFオブジェクトのバージョンは時間の経過とともに上がっていきますが、下位互換性は維持されます。
- 制御が可能: 開発者は、POFオブジェクトのシリアライズ方法またはデシリアライズ方法を制御できます。
- 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で機能する重要なコンポーネントです。
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を使用する場合、開発者は通常、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と関連するサンプル・ソース・コードをダウンロードしてインストールしておく必要があります。 以下の手順では、Oracle Coherence 3.7.1のインストール・プロセスおよび適切と考えられるインストールの場所について確認します。
注: Oracle Coherence 3.7.1のインストールがすでに完了している場合は、この手順をスキップできます。
コマンド・プロンプトを開いて、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注釈を使用したクラスの変更によるシリアライズのサポート
- "JSR 175: Javaプログラミング言語のメタデータ機能"に基づいており、Java 5で導入されました。
- 定型挿入文の動作と特性を定義するために、クラスに追加されます。
- インタフェースを介して定義され、@Characteristic class {...}構文を使用してクラスに適用されます。
- Oracle Coherenceが、/opt/coherenceにインストールされている必要があります。
- OBEソースが、/opt/POF.OBEに解凍されている必要があります。
- example.entity.Person.java: 人物を表し、名前、性別、年齢、住所などの特徴を定義します。
- example.entity.Address.java: 住所を表し、番地、市町村、都道府県が含まれます。
- example.entity.test.TestPerson.java: 2つのエンティティ・クラスのインスタンスを作成し、com.tangosol.utilパッケージ・クラスを使用してシリアライズを実行します。
- example.entity.test.TestPersonPOF.java: TestPersonと同じですが、シリアライズされるエンティティがPOF注釈をサポートすることが前提条件となっています。
- com.tangosol.io.pof.PofAnnotationSerializer: これらのオブジェクトをOracle Coherenceでシリアライズする方法を指定します。
- com.tangosol.util.ExternalizableHelper: シリアライズ形式と非シリアライズ形式の間で、双方向の変換を行います。
- com.tangosol.util.Base: シリアライズされたデータに対して、基本的なサイズ指定情報と書式設定サービスを提供します。
注釈
Oracle CoherenceのPOFは、注釈の概念に基づいています。 注釈とは、次のようなものです。
次に例を示します。
定義例
public interface Animal { String type; }
使用例
@Animal(type="mammal") public class Bird {. . .}
POFをサポートするために、com.tangosol.io.pof.annotationパッケージにあるPortable注釈とPortableProperty注釈を使用してエンティティ・クラスに注釈を付けます。
Portableは、次のように定義されます。
@Target(value=TYPE)
@Retention(value=RUNTIME)
public interface Portable extends Annotation {}
これはタイプ(@Target (value = TYPE))の全体に適用され、それらのタイプがPOFを使用してシリアライズされる必要があることを示します。
Portable注釈について、詳しくはこちらをクリックしてください。
PortablePropertyは、次のように定義されます。
@Target(value={FIELD,METHOD})
@Retention(value=RUNTIME)
public interface PortableProperty extends Annotation {
public abstract int value();
public abstract Class codec();
}
PortablePropertyはフィールドまたはメソッドに適用され、値またはコーデック属性を指定します。 値の属性は、フィールドの識別にどのインデックス値が使用されるかを示します。
PortableProperty注釈について、詳しくはこちらをクリックしてください。
環境の設定
- POFのテストを簡素化するために、さまざまなスクリプトが提供されてきました。 これらのスクリプトは、特定の環境変数の設定に依存しています。 これらの変数には適切なデフォルト値が割り当てられているので、それらが正しい値であれば、デフォルト値を変更する必要はありません。
スクリプトでは、次のことが前提条件となっています。
これらのディレクトリのどちらかが異なる場合は、次の手順を実行してください。
コマンド・プロンプト・ウィンドウで、OBEソースが解凍されたディレクトリにいることを確認します。
テキスト・エディタで、bin/set-env.shスクリプトを開きます。
2つの変数を非コメント化し、使用中の環境に適した値に設定します。
注: デフォルト値の/opt/coherenceと/opt/POF.OBEを使用する場合は、変更は不要です。
#!/bin/bash
export OBE_HOME=/opt/my.pof.obe.location
export COH_HOME=/opt/my.coherence.location
標準クラスのサイズおよびシリアライズのパフォーマンスに関するテスト
このチュートリアルでは、シリアライズとデシリアライズの例として使用される、次の2つのエンティティ・オブジェクト・クラスをサンプルとして提供しています。
これら2つのクラスは、デフォルトでJava Serializableを実装し、変更をしなくてもOracle Coherenceキャッシュで使用できます。 ただし、どちらのクラスも、POFシリアライズをサポートするために、POF注釈を使用して簡単に変更できます。
また、シリアライズされたデータの速度とサイズをテストするために使用できる次の2つのクラスも提供されています。
オプション: テスト・ソースの検証
- エンティティ・オブジェクトのテストに使用されるTestPerson.javaクラスとTestPersonPOF.javaクラスは、シリアライズをテストするためにいくつかの興味深いクラスを使用します。 パッケージとクラスには、次のものが含まれています。
OBEソース・ツリーのルートに移動したと仮定して、どちらかのソースまたは両方のソースを開きます。
gedit src/java/example/entity/test/TestPerson.java src/java/example/entity/test/TestPersonPOF.java
赤色の枠は、検証の対象となる各メソッドを示しています。
クラスの変更によるPOF注釈のサポート
Personクラスを開きます。 このOBEで使用されるすべてのクラスのソースが、src/javaサブディレクトリにあることに注意してください。
クラスに注釈を付けることで、クラスが@Portable注釈を指定するようにします。 さらに、com.tansosol.io.pof.annotationパッケージにある注釈の両方にimportを追加します。
操作が完了すると、更新されたソースは次のようになります。
Portableプロパティでは、各プロパティに対してインデックスを提供する必要があります。 プロパティ・インデックスを昇順で割り当てます。 一時フィールドには注釈を付けないように注意してください。
操作が完了すると、更新されたソースは次のようになります。
POF注釈のテスト
結果は次のように表示されます。
オブジェクトのサイズが大幅に縮小され、シリアライズの速度が向上していることを確認してください。
Oracle Coherenceの構成によるPOFシリアライズのサポート
- POF構成ファイルを作成して、移入を行います。
- Oracle Coherenceを構成して、新しく作成されたPOF構成を使用するようにします。
- type-id: 開発者割当ての整数ID(1000以上)です。1000以下は、Oracle Coherence用に予約されていることに注意してください。
- class-name: ポータブル・オブジェクト・インタフェースを実装するJavaクラスの完全修飾名は、クラスパスで使用できる必要があります。 例は、次のようになります。
- クラスパスの使用: 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注釈を使用してエンティティ・オブジェクトを変更しました。 この項では、POF注釈を完全に理解するために、Oracle Coherenceを構成してPOFをシリアライズ・メカニズムとして使用するようにします。 POFシリアライズを使用するために、次のタスクを実行します。
POF構成ファイルの作成
- POF構成ファイルは、エンティティ・オブジェクトのIDとマッピングを定義するXMLファイルであるため、Oracle Coherenceで管理できます。
POFをサポートするエンティティ・オブジェクトは、通常、POF構成ファイルのuser-types要素に含まれる1つ以上のuser-type要素によって指定されます。
各user-type要素には、2つの必須の下位要素と、その他のオプション要素を指定します。 必須の下位要素とは、次の2つです。
<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
次のコメントがある場所を確認します。
<!--
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>
追加したエントリは、次のようになります。
<user-type>
<type-id>1001</type-id>
<class-name>example.entity.Person</class-name>
<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は、-Dtangosol.pof.enabled=trueを使用して有効化できます。
POF構成ファイルの名前を変更します。
コマンド・プロンプトで、OBEソースのルートにいることを確認します。 次に、POF構成ファイルの名前を変更します。
$ PWD
/opt/POF.OBE
$ mv config/pof-configuration.xml config/pof-config.xml
gedit bin/start-server.sh
SYS_OPT="$SYS_OPT -Dtangosol.pof.enabled=true"
更新されたスクリプトは、次のように表示されます。
POF構成のテスト
bin/start-server.sh > server.log 2>&1 &
tail -f server.log
Started DefaultCacheServer...の表示によってサーバーの起動が確認されるまで、待機します。 確認が完了した後は、tailを終了します。grep -i pof-config server.log
結果は次のように表示されます。
Oracle Coherenceとやり取りを行う簡単なシミュレーション・アプリケーションが提供されています。このアプリケーションは、エンティティの追加、エンティティへのアクセス、あるいはキャッシュの操作を実行します。
提供されているスクリプトは、多数のエントリを生成するシミュレーション・インスタンスをいくつか起動します。 これらのエントリにアクセスして終了してください。
シミュレーションの実行には2分かかり、2分経過すると自動的に終了します。
bin/start-sim.sh
シミュレーションを開始した後、約30秒間待機してから、シミュレーション・ログを検証します。 tailコマンドは、シミュレーションの進捗状況を監視するのに役立ちます。
tail -f sim.logs/sim.0.log
Coherenceキャッシュに、個人のエンティティが一定間隔で追加されていくのが分かります。grep -i pof.config sim.logs/*.log
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をナビゲートする際、次の機能を使用できます。
- ヘッダー・ボタンの非表示:
- ヘッダー内のボタンを非表示にするには、タイトルをクリックします。 ボタンを再表示するには、もう一度タイトルをクリックします。
- トピック一覧ボタン:
- すべてのトピックの一覧です。 いずれかのトピックをクリックすると、その項に移動します。
- すべてのトピックを開く/閉じる:
- すべての項の詳細を表示または非表示にします。 デフォルトでは、すべてのトピックが閉じられています。
- すべてのイメージを表示/非表示:
- すべてのスクリーンショットを表示または非表示にします。 デフォルトでは、すべてのイメージが表示されています。
- 印刷:
- コンテンツを印刷します。 現在表示または非表示にされているコンテンツが印刷されます。
このチュートリアルの特定の項に移動するには、一覧からトピックを選択してください。