この章では、Coherence RESTのサポートの概要について説明します。ユーザーは、Coherence RESTを使用するために、WebサービスおよびJAX-RSに精通する必要があります。
この章の内容は次のとおりです。
Coherence RESTは、HTTPプロトコルを介したCoherenceキャッシュおよびキャッシュ・エントリへの容易なアクセスを提供します。これは、多少Coherence*Extendに似ています。リモート・クライアントは、クラスタ自体のメンバーになることなく、Coherenceに保存されたデータにアクセスできます。ただし、POFシリアライズをクライアント上およびクラスタ内の両方で使用する必要がある独自プロトコルのCoherence*Extendと異なり、Coherence RESTでは、基本プロトコルとしてHTTPを使用して、JSONやXMLなどの複数の表現形式でデータをマーシャリングできます。Coherence RESTの利点は、RubyやPythonなど(Coherenceでネイティブにサポートされていない)別の言語で記述されたアプリケーションがキャッシュ・データと相互作用できるということです。
Coherence RESTは、次のOracleライブラリおよびサード・パーティ・ライブラリに依存します。JerseyおよびJackson JARSは、COHERENCE_HOME/libディレクトリに含まれます。Grizzly JARSは、Grizzlyプロジェクト・ページからダウンロードできます。
| 名前 | 説明 | ライセンス・タイプ | JARファイル |
|---|---|---|---|
| Jersey 1.8 | JAX-RSのリファレンス実装(JSR 311: RESTful Webサービス用Java API) |
|
|
| Grizzly 2.1.1 | Jerseyと最適に統合される埋込みWebサーバー(Glassfishの一部)。 |
|
|
| Jackson 1.8.1 | JSONシリアライザ | Apache 2.0 | jackson-all-1.8.1.jar |
Coherence RESTは、2つの構成ファイルを使用して構成されます。該当するファイルは次のとおりです。
キャッシュ構成デプロイメント・ディスクリプタ: このファイルは、クライアント側のキャッシュ・サービスおよびHTTPアクセプタを定義するために使用します。HTTPアクセプタはHTTPを介してリモートRESTからの接続を受け入れます。アクセプタには、クライアントが接続するクラスタ側のHTTPサーバーのアドレスおよびポートが含まれます。このファイルのスキーマは、coherence-cache-config.xsdファイルです。<http-acceptor>要素のすべてのリファレンスは、『Oracle Coherence開発者ガイド』を参照してください。
実行時には、クラスパスで最初に検出されたキャッシュ構成ファイルが使用されます。tangosol.coherence.cacheconfigシステム・プロパティを使用して、キャッシュ構成ファイルを明示的に指定することもできます。このファイルは、プログラムによっても設定できます。キャッシュ構成デプロイメント・ディスクリプタの詳細は、『Oracle Coherence開発者ガイド』を参照してください。
REST構成デプロイメント・ディスクリプタ: このファイルは、Jerseyリソース構成クラスおよびカスタム・アグリゲータおよびカスタム・エントリ・プロセッサを構成するために使用されます。ディスクリプタのデフォルト名はcoherence-rest-config.xmlで、スキーマはcoherence-rest-config.xsdファイルで定義されます。ファイルはクラスパス上に存在する必要があります。その名前はtangosol.coherence.rest.configシステム・プロパティを使用して上書きできます。REST構成デプロイメント・ディスクリプタの詳細なリファレンスは、付録A「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 addr;
}
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 addr;
}
public void setAddr(AddressJson addr) {
this.addr = addr;
}
}