こんばんは、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のどのキーに対して、
何の値を入れるのか?というのが指定できるようになります。
長くなってきたので、この辺で。