kagamihogeの日記

kagamihogeの日記です。

infinispanを動かした

JBoss動かしましたし、何かJBoss的なものを動かしたいなぁということで。infinispanでとりあえず Hello World 的なことをやる。

infinispanって何?

Infinispan Homepage · Infinispanによると、「すごいスケーラブルで高い可用性があるデータグリッドで100%pure javaなOSSのプロダクトです」とか書いてあります。まぁぶっちゃけJBoss民族用のmemcachedのようなキャッシュ機構と思えば、とりあえずの理解としてはOKのようです。


まず、pom.xmlに依存性を追加する。バージョンはなんも考えずに新しめのヤツを使う。

      <dependency>
         <groupId>org.infinispan</groupId>
         <artifactId>infinispan-core</artifactId>
         <version>5.1.0.BETA5</version>
      </dependency>

↑はjbossのリポジトリを見に行くので、pom.xmlにその情報もいれてしまう。※ココなどを参照。

<profiles>
      <profile>
         <id>jboss-public-repository</id>
         <activation>
            <property>
               <name>jboss-public-repository</name>
               <value>!false</value>
            </property>
         </activation>
         <repositories>
            <repository>
               <id>jboss-public-repository-group</id>
               <name>JBoss Public Maven Repository Group</name>
               <url>http://repository.jboss.org/nexus/content/groups/public</url>
               <releases>
                  <enabled>true</enabled>
                  <updatePolicy>never</updatePolicy>
               </releases>
               <snapshots>
                  <enabled>true</enabled>
                  <updatePolicy>never</updatePolicy>
               </snapshots>
            </repository>
         </repositories>
         <pluginRepositories>
            <pluginRepository>
               <id>jboss-public-repository-group</id>
               <name>JBoss Public Maven Repository Group</name>
               <url>http://repository.jboss.org/nexus/content/groups/public</url>
               <releases>
                  <enabled>true</enabled>
                  <updatePolicy>never</updatePolicy>
               </releases>
               <snapshots>
                  <enabled>false</enabled>
                  <updatePolicy>never</updatePolicy>
               </snapshots>
            </pluginRepository>
         </pluginRepositories>
      </profile>

   </profiles>

ちなみに、いわゆるMaven Repository: Search/Browse/ExploreのJBoss版とも言うべきサイトはSonatype Nexus Professional。jboss関連のmvnrepositoryに居ないdependencyって何処に居るんだよ……とか最初思ってたんですが、リポジトリのサイトが別なんですよ、と。

でまぁ、下記のようなコードを書いて動かすと、値が表示される。キャッシュに値が入れられますよ、と。

import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;

public class Quickstart {
    public static void main(String[] args) {
        Cache<Object, Object> c = new DefaultCacheManager().getCache();
        c.put("key", "value");
        System.out.println(c.get("key"));
    }
}

次、キャッシュサーバ&クライアントの動作を試す。

というわけでDownload · InfinispanからinfinispanをDL*1、適当なディレクトリに解凍して、binの下の↓を叩いてキャッシュサーバを起動する。


startServer.bat

と、ERROR: Please indicate protocol to run with -r parameter とエラーになる。キャッシュサーバのプロトコルは指定必須のようだ。オプションのヘルプを見ると、


-r, --protocol= Protocol to understand by the server. This is a mandatory option and you should choose one of these options
[memcached|hotrod|websocket]

とある。memcachedとwebsocketはわかるとして。hotrodって何だよって感じですが、要はバイナリ通信のことのようだ。※Infinispan Cheat Sheet from DZone Refcardz - Free, professional tutorial guides for developers のClient/server mode を参照。

というわけで、とりあえずhotrodモードで動かす。


startServer.bat -r hotrod

これでサーバは起動したので、クライアントのコードを書く。

まず、infinispanサーバにアクセスするためのライブラリが必要。なので、pom.xmlにその依存性を追加する。

      <dependency>
         <groupId>org.infinispan</groupId>
         <artifactId>infinispan-client-hotrod</artifactId>
         <version>5.1.0.BETA5</version>
      </dependency>

クライアントとなるJavaのコード。今回はキャッシュサーバもクライアントもlocalhostで動作させてます。

import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;

public class Client {
    public static void main(String[] args) {
        RemoteCacheManager cachemanager = new RemoteCacheManager("localhost");
        RemoteCache<Object, Object> cache = cachemanager.getCache();
        System.out.println(cache.containsKey("key"));
        cache.put("key", "value");
        System.out.println(cache.containsKey("key"));
        System.out.println(cache.get("key"));
    }
}

これで、false true value と表示される。

プロジェクト構成はこんな感じ。


参考情報

*1:実際にはサーバ起動用のスクリプトがあればいいのだけど