この章ではCoherence REST実装のデフォルト動作を変更する方法について説明します。
この章の内容は次のとおりです。
必要に応じて、カスタム・プロバイダおよびリソースを作成できます。このセクションでは、カスタム・プロバイダを登録する方法、およびCoherenceのデフォルト・ルート・リソースをオーバーライドする方法について説明します。
com.tangosol.coherence.rest.server.DefaultResourceConfig
クラスでは、カスタム・プロバイダまたはリソースの登録に使用できるパッケージ・スキャンをサポートします。次の例では、パッケージ・スキャンを使用して、カスタム・プロバイダおよびリソースを登録しています。
public class MyResourceConfig extends DefaultResourceConfig { public MyResourceConfig() { super("com.my.providers;com.my.resources"); } }
また次の例では、DefaultResourceConfig
クラスに定義されている1つ以上のregister
メソッドをオーバーライドして、カスタム・プロバイダ、カスタム・ルート・リソースを使用したり、フィルタおよびフィルタ・ファクトリを追加する方法を示します。
注意: Coherenceのデフォルト・プロバイダをオーバーライドする場合は必ずルート・リソース・クラスもオーバーライド(登録解除)してください(DefaultRootResource クラスは、デフォルト・プロバイダに依存して、必要な依存性および構成を提供します)。 |
public class MyResourceConfig extends DefaultResourceConfig { protected void registerRootResource() { // remove if you don't want Coherence defaults to be registered super.registerRootResource(); getClasses().add(MyRootResource.class); } protected void registerProviders() { // remove if you don't want Coherence defaults to be registered super.registerRootResource(); getSingletons().add(new MyProvider()); } protected void registerContainerRequestFilters() { // remove if you don't want Coherencedefaults to be registered super.registerRootResource(); getContainerRequestFilters().add(new MyRequestFilter()); } protected void registerContainerResponseFilters() { // remove if you don't want Coherence defaults to be registered super.registerRootResource(); getContainerResponseFilters().add(new MyResponseFilter()); } protected void registerResourceFilterFactories() { // remove if you don't want Coherence defaults to be registered super.registerRootResource(); getResourceFilterFactories().add(new MyResourceFilterFactory()); } }
キャッシュ構成ファイルでカスタム・リソース構成クラスを有効にするには、HTTPアクセプタ構成内の<resource-config>
要素を使用して、クラスの完全修飾名を追加します。たとえば、次のように指定します。
<proxy-scheme> <service-name>ExtendHttpProxyService</service-name> <acceptor-config> <http-acceptor> ... <resource-config> <instance> <class-name>package.MyResourceConfig</class-name> </instance> </resource-config> </http-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme>
Coherence RESTでは、リクエストの処理にデフォルトでOracleの軽量HTTPサーバーを使用します。ただし、この実装は本番環境には適切でなく、一般的には開発またはテスト時に使用されます。そのかわりに、CoherenceにはGrizzly HTTPサーバー実装が含まれ、Simple HTTPサーバーも使用できます。追加のHTTPサーバーの統合する方法については、このドキュメントでは述べません。Jerseyのドキュメントを参照してください。
この項の内容は次のとおりです。
Coherence RESTは、Grizzly 2 HTTPサーバー実装(com.tangosol.coherence.rest.server.GrizzlyHttpServer
)を備えており、デフォルトのHTTPサーバーのかわりに使用できます。Grizzly HTTPサーバーの詳細は、次を参照してください。
キャッシュ構成ファイルでGrizzlyサーバーを有効にするには、HTTPアクセプタ構成内の<class-name>
要素の値として実装の完全修飾名を追加します。たとえば、次のように指定します。
<proxy-scheme> <service-name>ExtendHttpProxyService</service-name> <acceptor-config> <http-acceptor> <class-name>com.tangosol.coherence.rest.server.GrizzlyHttpServer </class-name> ... </http-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme>
SimpleフレームワークはJersey内でサポートされているため、埋込みHTTPサーバーとして使用できます。Simpleフレームワークの詳細は、次を参照してください。
http://www.simpleframework.org/
埋込みHTTPサーバーとしてSimpleフレームワークを使用するには、com.tangosol.coherence.rest.server.AbstractHttpServer
クラスを拡張して、そのクラスをキャッシュ構成ファイルで有効にします。
次の例では、SimpleHttpServer
クラスを作成します。
public class SimpleHttpServer extends AbstractHttpServer { public void start() { Closeable connection = m_connection; if (connection == null) { try { connection = SimpleServerFactory.create("http://" + getLocalAddress() + ":" + getLocalPort(),getResourceConfig()); } catch (IOException e) { throw new WrapperException(e); } m_connection = connection; } } public void stop() { Closeable connection = m_connection; if (connection != null) { try { connection.close(); } catch (IOException e) { throw new WrapperException(e); } finally { m_connection = null; } } } protected Closeable m_connection; }
キャッシュ構成ファイルでSimpleHttpServer
クラスを有効にするには、HTTPアクセプタ構成内の<class-name>
要素の値として完全修飾名を追加します。たとえば、次のように指定します。
<proxy-scheme> <service-name>ExtendHttpProxyService</service-name> <acceptor-config> <http-acceptor> <class-name>package.SimpleHttpServer</class-name> ... </http-acceptor> </acceptor-config> <autostart>true</autostart> </proxy-scheme>