2013年4月12日金曜日

JBossDataGridをライブラリモードで使ってみる

JBossテクニカルチームの寺田です。
今回は、JBoss Data Gridのライブラリモードで動かしてみました。

RedHatが出している「JBoss Data Grid 6 スタートガイド」というものがあります。 このスタートガイドで扱っているサンプルのうち、embedded-cache、clustered-cacheは infinispanのquick-startをそのまま使っているものとなります。 この2つは、ライブラリモードで動かします。 取得方法は、infinispanのリポジトリからgitで取得することが出来ます。

また、JBoss Data Gridにして、RedHat社が追加したスタートガイドのサンプルは、 jboss-datagrid-quickstarts-1.0.1に含まれているcarmartおよびfootballですが、footballはライブラリモードではなく、クライアントサーバ接続のものなので省略し、carmartのみ扱います。

1.embedded-cache

embedded-cacheはキャッシュの作り方や取得の方法を説明しています。
簡単なキャッシュの作成と取得方法は以下の3つがあります。
・何も指定せず、デフォルトで作成する
      Cache c = new DefaultCacheManager().getCache();
・メソッドパラメータでキャッシュの振る舞いを定義
      EmbeddedCacheManager manager = new DefaultCacheManager();
      manager.defineConfiguration("custom-cache", new ConfigurationBuilder()
            .eviction().strategy(LIRS).maxEntries(10)
            .build());
      Cache c = manager.getCache("custom-cache");
・xmlで以下のようにキャッシュの振る舞いを定義
   <namedCache name="xml-configured-cache">
      <eviction strategy="LIRS" maxEntries="10" />
   </namedCache>
また、キャッシュにKey-valueを追加削除は以下のように行います。
   キャッシュにキーを追加
      cache.put("key", "value");
   キャッシュからキーを削除
      Object v = cache.remove("key");
   キャッシュをクリア
      cache.clear();
キャッシュに5秒の生存期間のデータを追加
      cache.put("key", "value", 5, SECONDS);
キャッシュのデータのキーが"key"となっているデータの存在を確認
   if(cache.containsKey("key"))

2.clustered-cache

クラスタリングはJGROUPというライブラリを使って行っています。
クラスタリングのモードには、レプリケーションと分散があり、それぞれ以下のように設定します
  • レプリケーション:<clustering mode="replication">
  • 分散:<clustering mode="distribution">
  分散の場合は、エントリを保持するノードの個数を指定しますが、<hash numOwners="2"/> というように設定します。

3.carmart

carmartは、Webアプリケーションとして動作させますが、以下の3つのパターンのサンプルになっています。
  • carmart通常
  • carmart-transactionalトランザクション版
  • carmartリモート接続版
しかし、carmart-transactional以外は言及すべきポイントもないのと、リモート接続版はライブラリモードではないため省略し、ここではトランザクション版について言及させていただきます。
トランザクション版は、ロールバックを行っていて、具体的には、以下のサンプルのコードでは、ロールバック前提の追加操作のボタンを押下した際に呼ばれるコードですが、赤字の部分で、強制的に例外を発生させ、ロールバックしています。

トランザクションはライブラリモードでしか使えないので、トランザクション制御をする実装を行うにはライブラリモードで実装することを想定しておく必要がありそうです。
トランザクションまわりのお話はもうすこし深く掘り下げてみていく必要がありそうなので、別記事にしようかと思います。
import javax.transaction.UserTransaction;
・・・・・
public class CarManager {
・・・・
    private UserTransaction utx;    
・・・・・
    public String addNewCarWithRollback() {
        boolean throwInducedException = true;
        carCache = provider.getCacheContainer().getCache(CACHE_NAME);
        try {
            utx.begin();
            List carNumbers = getNumberPlateList(carCache);
            carNumbers.add(car.getNumberPlate());
            //store the new list of car numbers and then throw an exception -> roll-back
            //the car number list should not be stored in the cache
            carCache.put(CAR_NUMBERS_KEY, carNumbers);
            if (throwInducedException) throw new RuntimeException("Induced exception");
            carCache.put(CarManager.encode(car.getNumberPlate()), car);
            utx.commit();
        } catch (Exception e) {
            if (utx != null) {
                try {
                    utx.rollback();
                    log.info("Rolled back due to: " + e.getMessage());
                } catch (Exception e1) {
                }
            }
        }
        return "home";
    }
今回は、ざっと、サンプルをもとにライブラリモードで動かしてみました。 機能としてはいろいろあるようですが、トランザクション機能のようにライブラリモードのみの機能もあり、他にも制限もありそうなので、深くほり下げてみていく必要がありそうですが、時間の都合もありまた別の機会に深く調べていきたいと思います。
今回の記事は、ざっとライブラリモードを見てみたところで終了とさせていただきます。

0 件のコメント:

コメントを投稿