GuavaのChacheをScalaから使って、定期的にインスタンス変数のキャッシュをリセットする
GuavaのChacheをScalaから使って、定期的にインスタンス変数のキャッシュをリセットする
DBのコネクション数などを考えれば、Remote Actorのインスタンス変数に、 値をキャッシュするようなケースは容易に想像できる。
このインスタンス変数でキャッシュをするような場合に、これを定期的にリフレッシュする方法として、 Google製のJavaライブラリGuavaから、Cacheを使うやり方を紹介する。
下記の例では、cache.get()
で、所定のキーを呼び出しそのキーが存在する場合は、キーに対応する値を返す。
cache
にキーが存在しない場合、Callable
をインスタンス化することで、call
メソッドでキーに対応する値を返すようにしている。
このキャッシュを1秒間でリセットするようにしており、Thread.sleep(1000)
をした後、cache
に対してキーを呼び出すと、call
が再度呼び出されるはずである。
object cacheTest { def main(args: Array[String]) = { val cache: Cache[String,String] = CacheBuilder .newBuilder().maximumSize(10).expireAfterWrite(1, java.util.concurrent.TimeUnit.SECONDS).build() val a1 = cache.get("aa", new Callable[String] { def call(): String = { println("called") "hoge" } }) println(a1) val a2 = cache.get("aa", new Callable[String] { def call(): String = { println("called") "hoge" } }) println(a2) Thread.sleep(1000) val a3 = cache.get("aa", new Callable[String] { def call(): String = { println("called") "hoge" } }) println(a3) } }
これを実行すると、出力は次のようになる。
called hoge hoge called hoge