[応用機能]コンテキスト

アプリケーション開発において、処理中のデータを格納し、必要な時に照会するデータの格納場所が必要とされる場合があります。

データを格納及び照会する機能を抽象化したのが、Contextです。
Contextに格納したデータを永続化する機能を抽象化したのがContextStoreです。
データを複数のサーバを跨いで共有する機能を抽象化したのが、SharedContextです。
単一のサーバでは保持できない大量のデータを複数のサーバを跨いで分散共有する機能を抽象化したのが、DistributedSharedContextです。

関連するパッケージは、以下です。

アプリケーション向けインタフェース Context

アプリケーション向けインタフェースContextを使った簡単なアプリケーションのサンプルを示します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.context.Context;
  3. // Contextを取得
  4. Context context = (Context)ServiceManagerFactory.getServiceObject("Context");
  5. // データを格納する
  6. context.put("hoge", new Integer(100));
  7. // データを取得する
  8. System.out.println(context.get("hoge"));
  9. // データを削除する
  10. context.remove("hoge");

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.context.DefaultContextServiceデフォルト実装。静的にデータを格納する。
jp.ossc.nimbus.service.context.ThreadContextService処理スレッド毎にデータを格納する。
jp.ossc.nimbus.service.context.ServerInfoServiceサーバの静的な情報を照会する。
jp.ossc.nimbus.service.context.GroupContextService複数のコンテキストをグル-ピングして照会する。

Contextインタフェース実装サービス向けインタフェース ContextStore

Contextインタフェース向けインタフェースContextStoreは、Contextインタフェース実装サービスに設定する事で、格納したデータを永続化したり、永続化されたデータをコンテキスト上に読み込ませたりする事ができます。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービスインタフェース用途
jp.ossc.nimbus.service.context.Contextコンテキスト情報を永続化するために使用する

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.context.DatabaseContextStoreServiceデータベースに永続化する。

アプリケーション向けインタフェース SharedContext

Contextインタフェースを継承しているため、サーバを跨って共有されている事を意識せずにデータの格納及び参照を行う事ができます。
拡張されている機能は、以下です。

  • 非同期更新
  • 差分更新
  • 更新通知
  • キー単位での更新ロック
  • ローカルにデータを持たない(キャッシュ機能あり)クライアントモード
  • キーではなく値を使ったインデックス検索
  • データを保持しているノードでロジックをインタープリタ実行する

アプリケーション向けインタフェースSharedContextを使った簡単なアプリケーションのサンプルを示します。

  1. import java.util.*;
  2. import jp.ossc.nimbus.core.ServiceManagerFactory;
  3. import jp.ossc.nimbus.service.context.SharedContext;
  4. import jp.ossc.nimbus.service.context.SharedContextRecord;
  5. // SharedContextを取得
  6. SharedContext context = (SharedContext)ServiceManagerFactory.getServiceObject("Context");
  7. // データを格納する
  8. context.put("hoge", new Integer(100));
  9. // データを取得する
  10. System.out.println(context.get("hoge"));
  11. // データを削除する
  12. context.remove("hoge");
  13. // 構造化データを格納する
  14. SharedContextRecord record = new SharedContextRecord(
  15. ":name,java.lang.String\n"
  16. ":age,int"
  17. );
  18. record.setProperty("name", "Yamada hanako");
  19. record.setProperty("age", 10);
  20. context.put("001", record);
  21. try{
  22. // キー指定で更新をロックする
  23. context.lock("001");
  24. // データを取得する
  25. record = (SharedContextRecord)context.get("001");
  26. // 更新差分を取得する
  27. SharedContextValueDifference diff = record.updateProperty("name", "Tanaka hanako", null);
  28. diff = record.updateProperty("age", 25, diff);
  29. // 差分更新する
  30. context.update("001", diff);
  31. }finally{
  32. // 更新ロックを解除する
  33. context.unlock("001");
  34. }
  35. // インデックスを設定する
  36. // 基本的には、サービス定義で予め設定しておく
  37. context.setIndex("AGE_INDEX", new String[]{"age"});
  38. // インデックス情報を再解析する
  39. context.analyzeIndex("AGE_INDEX");
  40. // 検索キーを生成する
  41. SharedContextRecord searchKey = new SharedContextRecord(
  42. ":name,java.lang.String\n"
  43. ":age,int"
  44. );
  45. searchKey.setProperty("age", 10);
  46. // インデックスを使って検索し、キー集合を取得する
  47. Set keySet = context.createView().searchBy(searchKey, "AGE_INDEX", null).getResultSet();
  48. // 検索条件マップを生成する
  49. Map variables = new HashMap();
  50. variables.put("age", new Integer(10));
  51. // インタプリタ実行する
  52. Integer count = (Integer)context.executeInterpretQuery(
  53. "import java.util.*;"
  54. + "import jp.ossc.nimbus.service.context.SharedContextRecord;"
  55. + "int count = 0;"
  56. + "Iterator vals = context.values().iterator();"
  57. + "while(vals.hasNext()){"
  58. + "SharedContextRecord rec = (SharedContextRecord)itr.next();"
  59. + "if(rec.getProperty(\"age\") != null && rec.getProperty(\"age\").compareTo(age) >= 0){"
  60. + "count++;"
  61. + "}"
  62. + "}"
  63. + "return count;",
  64. variables
  65. );

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.context.SharedContextServiceデフォルト実装。

アプリケーション向けインタフェース DistributedSharedContext

SharedContextインタフェースを継承しているため、サーバを跨って分散共有されている事を意識せずにデータの格納及び参照を行う事ができます。
アプリケーション向けインタフェースDistributedSharedContextを使ったサンプルは、SharedContextを参照。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.context.DistributedSharedContextServiceデフォルト実装。

サンプルは、以下。