この章の内容は次のとおりです。
Coherence RESTは、HTTPプロトコルを介したCoherenceキャッシュおよびキャッシュ・エントリへの容易なアクセスを提供します。これは、Coherence*Extendに似ています。リモート・クライアントは、クラスタ自体のメンバーになることなく、Coherenceに保存されたデータにアクセスできます。ただし、独自のプロトコルのCoherence*Extendと異なり、Coherence RESTでは、基本プロトコルとしてHTTPを使用して、JSONやXMLなどの複数の表現形式でデータをマーシャリングできます。Coherence RESTの利点は、RubyやPythonなど(Coherenceでネイティブにサポートされていない)別の言語で記述されたアプリケーションがキャッシュ・データと相互作用できるということです。
Coherence RESTの例
Coherenceディストリビューションには、RESTアプリケーションのエンドツーエンドの例が含まれます。Coherence RESTの例の実行の詳細は、『Oracle Coherenceのインストール』を参照してください。
Coherence REST実装は、COHERENCE_HOME
/lib/coherence-rest.jar
ライブラリにパッケージ化され、coherence.jar
ライブラリに依存します。また、Coherence REST実装では、多くのライブラリ依存性が含まれ、様々なHTTPサーバー実装(Grizzly HTTPサーバー、Simple HTTPサーバー、およびJetty HTTPサーバー)もサポートしています。これらの依存性を管理するには、アプリケーションでMavenを使用することを強くお薦めします。初めてMavenを使用する場合は、https://maven.apache.org/
を参照してください。
Coherence RESTとGrizzly HTTPサーバーを使用するには、次の依存性をMaven pom.xml
ファイルに追加します。
<dependencies> <dependency> <groupId>com.oracle.coherence</groupId> <artifactId>coherence</artifactId> <version>12.2.1-0-0</version> </dependency> <dependency> <groupId>com.oracle.coherence</groupId> <artifactId>coherence-rest</artifactId> <version>12.2.1-0-0</version> </dependency> <dependency> <groupId>org.glassfish.grizzly</groupId> <artifactId>grizzly-http-server</artifactId> <version>2.3.19</version> </dependency> </dependencies>
必要なすべての依存性が自動的にダウンロードされます。ライブラリの完全なリストを表示するには、次のMavenコマンドを実行します。
mvn dependency:list
pom.xml
ファイルの詳細は、Coherence RESTの例を参照してください。
Coherence RESTは、2つの構成ファイルを使用して構成されます。該当するファイルは次のとおりです。
注意:
Coherence RESTをJavaEEサーバーにデプロイする場合、web.xml
ファイルの構成も必要です。詳細は、「Java EEサーバー(一般)へのデプロイ」を参照してください。
キャッシュ構成デプロイメント・ディスクリプタ: このファイルは、クライアント側のキャッシュ・サービスおよびHTTPアクセプタを定義するために使用します。HTTPアクセプタはHTTPを介してリモートRESTからの接続を受け入れます。アクセプタには、クライアントが接続するクラスタ側のHTTPサーバーのアドレスおよびポートが含まれます。このファイルのスキーマは、coherence-cache-config.xsd
ファイルです。<http-acceptor要素の詳細なリファレンスは、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
実行時には、クラスパスで最初に検出されたキャッシュ構成ファイルが使用されます。coherence.cacheconfig
システム・プロパティを使用して、キャッシュ構成ファイルを明示的に指定することもできます。このファイルは、プログラムによっても設定できます。キャッシュ構成デプロイメント・ディスクリプタの一般的な情報は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
REST構成デプロイメント・ディスクリプタ - このファイルは、Jerseyリソース構成クラスおよびカスタム・アグリゲータおよびカスタム・エントリ・プロセッサを構成するために使用されます。ディスクリプタのデフォルト名はcoherence-rest-config.xml
で、スキーマはcoherence-rest-config.xsd
ファイルで定義されます。ファイルはクラスパス上に存在する必要があり、その名前はcoherence.rest.config
システム・プロパティを使用してオーバーライドできます。REST構成デプロイメント・ディスクリプタの詳細なリファレンスは、「RESTの構成要素」を参照してください。
Coherence RESTは、入力および出力としてXMLおよびJSONフォーマットをサポートします。これらのフォーマットを使用するには、ユーザー・タイプを作成するときに正しいバインディングが必要になります。この項では、この両方のフォーマットについて説明します。
この項の内容は、次のとおりです。
XMLで参照されるオブジェクトは、キャッシュに保存されるために適切なJAXBバインディングを定義する必要があります。次の例では、JAXBバインディングを追加する注釈を使用するオブジェクトを作成します。
@XmlRootElement(name="Address") @XmlAccessorType(XmlAccessType.PROPERTY) public class Address { private String street; private String city; private String country; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } @XmlRootElement(name="Person") @XmlAccessorType(XmlAccessType.PROPERTY) public class Person { private Long id; private String name; private Address address; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "address") public AddressXml getAddr() { return address; } public void setAddr(AddressXml addr) { this.addr = addr; } }
JSONで参照されるオブジェクトは、キャッシュに保存されるために適切なJacksonバインディングまたはJAXBバインディングを定義する必要があります。デフォルトのCoherence REST JSONマーシャリング処理ではJacksonバインディングが優先されます。Jacksonバインディングが検出されない場合、JAXBバインディングがかわりに使用されます。Jackson注釈を使用することで、出力JSONフォーマットの制御性が向上します。ただし、XMLおよびJSONフォーマットの両方が必要な場合、JAXB注釈は両方のフォーマットに対して十分に使用できます。
次の例では、注釈を使用するオブジェクトを作成して、Jacksonバインディングを追加しています。
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include= JsonTypeInfo.As.PROPERTY, property="@type") public class Address { private String street; private String city; private String country; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include= JsonTypeInfo.As.PROPERTY, property="@type") public class Person { private Long id; private String name; private Address address; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @JsonProperty("address") public AddressJson getAddr() { return address; } public void setAddr(AddressJson addr) { this.addr = addr; } }