Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

InfinispanをRESTサーバで利用する

こんばんは、ishidaです。

kimukimuが調べているinfinispanで、私もちょっと試してみました。
今回はRESTサーバでinfinispanを利用します。

1.早速試しましょう。

今回はLOCAL mode cacheでinfinispanを利用します。
参考にしたのは公式のGetting Started Guideです。

ダウンロードしたinfinispanの中にあるmodules/restのwarファイルを使います。

tomcatのwebapps配下にinfinispan-server-rest.warを配置してtomcatを起動します。
アクセス用のプログラムは、公式のGetting Started Guideに載っているコードを使います。

public static void main(String[] args) throws IOException {
	// Attention to the cache name "cacheX" it was configured in xml file
	// with tag <namedCache name="cacheX">
	RestExample restExample = new RestExample();
	restExample.putMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/1",
			"Infinispan REST Test");
	restExample.getMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/1");
}

ただし、このままでは動きません。Guideに書いてある通り、infinispan.xmlを用意して
読み込ませてあげる必要があります。

プログラム上「cacheX」という名前のキャッシュを使うようなので、
以下のようなinfinispan.xmlを用意します(今回用に最低限のみ用意)

<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="urn:infinispan:config:4.2 
http://www.infinispan.org/schemas/infinispan-config-4.2.xsd" 
xmlns="urn:infinispan:config:4.2">
    <namedCache name="cacheX" />
</infinispan>

用意したinfinispan.xmlをWEB-INF/classes配下に配置し、web.xmlの「infinispan.config」の値を
「infinispan.xml」に変更してあげます。

2.動かします

上記が完了したら、tomcatを再起動してアプリを動かしましょう。

----------------------------------------
Executing PUT
----------------------------------------
executing request http://localhost:8080/infinispan-server-rest/rest/cacheX/1
Executing put method of value: Infinispan REST Test
----------------------------------------
200 OK
----------------------------------------
----------------------------------------
Executing GET
----------------------------------------
executing request http://localhost:8080/infinispan-server-rest/rest/cacheX/1
Executing get method of value: Infinispan REST Test

----------------------------------------
200 OK
----------------------------------------

動いたみたいですね。cacheXに登録した文字列
「Infinispan REST Test」の登録と読み込みに成功しました。

3.本当にキャッシュできてるの?

同じプログラム内でいっぺんに動かしてしまうと思いますよね(^^;

というわけでちょっと改造です。
メイン内でまずは値が登録されていないcacheXのキー「abc」に対して
値の取得を行いましょう。

//	restExample.putMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/abc",
//			"Infinispan REST Test2");
	restExample.getMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/abc");

案の定、怒られました。

----------------------------------------
Executing GET
----------------------------------------
executing request http://localhost:8080/infinispan-server-rest/rest/cacheX/abc
Exception in thread "main" java.io.FileNotFoundException:
	http://localhost:8080/infinispan-server-rest/rest/cacheX/abc
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at test.RestExample.getMethod(RestExample.java:77)
	at test.RestExample.main(RestExample.java:108)

では、今度は登録のみ行います。先ほどのコメントアウトしたputMethodを復活させ、逆にgetMethodをコメントアウトします。

	RestExample restExample = new RestExample();
	restExample.putMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/abc",
			"Infinispan REST Test2");
//	restExample.getMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/abc");

登録されましたね。

----------------------------------------
Executing PUT
----------------------------------------
executing request http://localhost:8080/infinispan-server-rest/rest/cacheX/abc
Executing put method of value: Infinispan REST Test2
----------------------------------------
200 OK
----------------------------------------

今度は、取り出しだけしましょう。putMethodをコメントアウト、
getMethodのコメントアウトを外します。

//	restExample.putMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/abc",
//			"Infinispan REST Test2");
	restExample.getMethod("http://localhost:8080/infinispan-server-rest/rest/cacheX/abc");

今度は取り出せました。サーバとして値をキャッシュしているのが動きからもわかりますね。

----------------------------------------
Executing GET
----------------------------------------
executing request http://localhost:8080/infinispan-server-rest/rest/cacheX/abc
Executing get method of value: Infinispan REST Test2

----------------------------------------
200 OK
----------------------------------------

確かに、RESTサーバとしてinfinispanを使うことで、簡単にキャッシュ機能を
実現することができました。

3.おまけ、仕組み

どうやって値の登録、取得をしているのか?公式のHELPにも書いてありますが、
簡単に今回やった分を紹介しておきます。

サンプルプログラム内で「GET」や「PUT」、そして「Content-Type」を登録してある処理がありますが、
これが決め手みたいですね。
これらのキーワードが指定されると、内部でURLを解釈して

/{cacheName}/{cacheKey}
と認識して値の登録などをしてくれるようです。
※他にもPOSTやDELETEもあるようです。

このため、putやgetを行う際に、URLを指定するだけで、どのcacheのどのキーに対して、
何の値を入れるのか?というのが指定できるようになります。


長くなってきたので、この辺で。