2014/12/13 第1回 scala関西勉強会 play2-memcached supports play 2.4 ~play...

91
play2-memcached supports Play 2.4 ~ Play 2.4モジュールのつくりかた ~ @mumoshu

Upload: yusuke-kuoka

Post on 12-Jul-2015

742 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play2-memcached supports Play 2.4 !

~ Play 2.4モジュールのつくりかた ~

@mumoshu

Page 2: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

九岡 佑介(くおか ~)https://www.wantedly.com/users/392910

Page 3: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

@mumoshu

• 2008年~ NECビッグローブ (JavaScript)

• 2010年~ フリュー (JavaScript/Scala)

• 2013年~ グリー (Scala/Ruby/インフラ)

• 2014年~ クラウドワークス(Ruby/インフラ)

Page 4: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

福井県出身おろし蕎麦が好き

Page 5: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

クラウドワークスクラウドソーシングサービス http://crowdworks.jp/

Page 6: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

仕事を探す・仕事をする・報酬をもらうインターネット上で完結

Page 7: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

仕事の発注と受注ができるリモートワーク前提

Page 8: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

188種類の仕事が発注できる

Page 9: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

“クラウドソーシングは労働の「オープンソース化」”ジェフ・ハウ http://crowdworks.jp/adviser

Page 10: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

“自分が将来リモートワークをする際の下地づくり”@mumoshu

Page 11: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

「働く」を通して人々に笑顔を クラウドワークスのスローガン http://crowdworks.co.jp/

Page 12: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

「ありがとう」ボタン

感謝の気持ちの可視化

Page 13: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

アジェンダ• play2-memcachedについて

• Playプラグイン?モジュール?

• Play 2.3までのキャッシュプラグイン

• Play 2.4からのキャッシュモジュール

• Play 2.4でキャッシュモジュールを書くときに知っておきたいこと

Page 14: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play2-memcached

Page 15: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play2-memcached

• https://github.com/mumoshu/play2-memcached

• Play2向けキャッシュ実装の一つ

Page 16: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play2-memcached• Play2標準はEhCacheベースのキャッシュ

• EhCacheはJavaベースのキャッシュ。Playではインメモリキャッシュとして、Play 1の時代から利用されている

• play2-memcachedを使うと、標準のキャッシュと同じインタフェースでMemcachedベースのキャッシュが使える

• Play2.0時代から存在。そこそこ歴史あり

Page 17: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

アジェンダ• play2-memcachedについて

• Playプラグイン?モジュール?

• Play 2.3までのキャッシュプラグイン

• Play 2.4からのキャッシュモジュール

• Play 2.4でキャッシュモジュールを書くときに知っておきたいこと

Page 18: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playプラグイン?モジュール?

Page 19: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playプラグイン?モジュール?

• Playのバージョンによって、Playの拡張方法が異なります

Page 20: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playプラグイン?モジュール?• Play 2.3まで

• Playプラグインでフレームワークを拡張する

• Play 2.4から

• Playモジュールで拡張する

• 2.4.0-M2時点ではプラグインもまだ使えるようだが、既にPlayの組み込みプラグインはモジュールに置き換えされている

Page 21: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playプラグイン?モジュール?

• キャッシュプラグイン/モジュールでPlayを拡張すると、EhCache以外のキャッシュを使えるようになる

• 例えばplay2-memcached

Page 22: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

アジェンダ• play2-memcachedについて

• Playプラグイン?モジュール?

• Play 2.3までのキャッシュプラグイン

• Play 2.4からのキャッシュモジュール

• Play 2.4でキャッシュモジュールを書くときに知っておきたいこと

Page 23: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3までのキャッシュプラグイン

Page 24: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3までのキャッシュ• play.api.cache.CachePlugin

• play.api.cache.CacheAPI

Page 25: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3までのキャッシュ• play.api.cache.CachePlugin

• play.api.cache.CacheAPIの実装を返す

• Playの起動・終了時に処理をフックできる

• play.api.cache.CacheAPI

• キャッシュの読み書きのインタフェース

Page 26: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3までのキャッシュ• イメージ

• EhcachePluginがEhcacheCacheAPIImplを提供

• MemcachedPluginがMemcachedCacheAPIImplを提供

• RedisPluginがRedisCacheAPIImplを提供

• みんなCacheAPIで同様に扱える!

Page 27: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3までのキャッシュ• Playプラグインの機構で、PlayにCachePluginをロードさせる

• 標準のEhCachePluginを無効化してMemcachedPluginを有効化すれば、PlayはMemcachedの方を使う

Page 28: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

CacheAPIをロードしてみよう• 突然のScalaコード

Page 29: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# application.confに設定が書かれている前提で…

val app = new play.core.StaticApplication(new java.io.File(“.”))

# 2.3までの、Playがプラグイン経由でMemcachedベースのキャッシュ実装をロードする方法

play.api.Play.current.plugin[play.api.cache.CachePlugin]

//=> Option[play.api.cache.CachePlugin] = Some(com.github.mumoshu.play2.memcached.MemcachedPlugin@47afef67)

Page 30: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# テストならapplication.confに相当する設定をもとに…

val app = play.api.test.FakeApplication( additionalConfiguration = Map( "ehcacheplugin" -> "disabled", "memcached.host" -> "127.0.0.1:11211" ) )

play.api.Play.current.plugin[play.api.cache.CachePlugin]

Page 31: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

アジェンダ• play2-memcachedについて

• Playプラグイン?モジュール?

• Play 2.3までのキャッシュプラグイン

• Play 2.4からのキャッシュモジュール

• Play 2.4でキャッシュモジュールを書くときに知っておきたいこと

Page 32: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.4からのキャッシュモジュール

Page 33: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.4からのキャッシュ• play.api.inject.Module

• play.api.inject.ApplicationLifecycle

Page 34: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.4からのキャッシュ• play.api.inject.Module

• play.api.cache.CacheApiの実装を返す(2.3まではCachePluginでしたね)

• play.api.inject.ApplicationLifecycle

• Playの終了時に処理をフックできる(2.3まではCachePluginでしたね)

Page 35: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.4からのキャッシュ• プラグインとは別の「Playモジュール」の機構を使って、Playの標準モジュールを入れ替えたり、追加したりできる。

• 標準のEhCacheModuleを無効化して、代わりにMemcachedModuleを追加すればCacheApiの実装を変えることができる

Page 36: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

CacheApiをロードしてみよう• 突然のScalaコード

Page 37: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# 2.4からの、Playがモジュール経由でMemcachedベースのキャッシュ実装をロードする方法app.injector.instanceOf(classOf[play.api.cache.CacheApi])

//=> play.api.cache.CacheApi = com.github.mumoshu.play2.memcached.MemcachedCacheApi@52556f47

Page 38: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3との違い• 突然のScalaコード

Page 39: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# 2.3までの、Playがプラグイン経由でMemcachedベースのキャッシュ実装をロードする方法

play.api.Play.current.plugin[play.api.cache.CachePlugin].get.api

//=> play.api.cache.CacheAPI = com.github.mumoshu.play2.memcached.MemcachedPlugin$$anon$2@6ba816fe

Page 40: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# 2.4からの、Playがモジュール経由でMemcachedベースのキャッシュ実装をロードする方法app.injector.instanceOf(classOf[play.api.cache.CacheApi])

//=> play.api.cache.CacheApi = com.github.mumoshu.play2.memcached.MemcachedCacheApi@52556f47

Page 41: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.3との違い• これだけだと書き方の違いだけ、という印象

Page 42: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

テスト中でCacheApiを使いたいとき• 突然のScalaコード

Page 43: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

val app = play.api.test.FakeApplication( additionalConfiguration = Map( "play.modules.enabled" -> List("com.github.mumoshu.play2.memcached.MemcachedModule"), "play.modules.disabled" -> List("play.api.cache.EhCacheModule"), "play.modules.cache.defaultCache" -> “default”, "memcached.1.host" -> memcachedHost )

)

val cacheApi = app.injector.instanceOf(classOf[play.api.cache.CacheApi])

Page 44: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

アジェンダ• play2-memcachedについて

• Playプラグイン?モジュール?

• Play 2.3までのキャッシュプラグイン

• Play 2.4からのキャッシュモジュール

• Play 2.4でキャッシュモジュールを書くときに知っておきたいこと

Page 45: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.4でキャッシュ関連のモジュールを書くときに知っておきたいこと ~パッケージ編~

Page 46: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

これだけは知っておきたい パッケージ

• play.api.inject

• play.api.cache

Page 47: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

これだけは知っておきたい クラス

• play.api.inject.Module

• play.api.cache.CacheApi

Page 48: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject

Page 49: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject• Play2のDependency InjectionのAPI

• Play2にはDIフレームワークのラッパとなるAPIと、デフォルトの実装が同梱

• デフォルト実装はGoogleのDIフレームワーク Guiceベース

• Play 2.4からはPluginは非推奨になり、play.api.inject.ModuleによってPlayを拡張

Page 50: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.cache

Page 51: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject• Play2のDependency InjectionのAPI

• Play2にはDIフレームワークのラッパとなるAPIと、デフォルトの実装が同梱

• デフォルト実装はGoogleのDIフレームワーク Guiceベース

• Play 2.4からはPluginは非推奨になり、play.api.inject.ModuleによってPlayを拡張

Page 52: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Play 2.4でキャッシュ関連のモジュールを書くときに知っておき

たいこと ~クラス編~

Page 53: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.cache.CacheAPI /

play.api.cache.CacheApi

Page 54: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

CacheAPI/CacheApi

• Play2のキャッシュが満たすべきインタフェース

• CacheAPIを実装していればEhCache、Memcached、Redisなど同じように扱えるうれしさ

• Play 2.4で少し変わります

Page 55: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

CacheAPI/CacheApi

• 新(2.4から)・旧(2.3まで)のソースを見てみましょう

Page 56: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# Play 2.3まで

trait CacheAPI {

def set(key: String, value: Any, expiration: Int)

def get(key: String): Option[Any]

def remove(key: String)

}

Page 57: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

# Play 2.4から

trait CacheApi {

def set(key: String, value: Any, expiration: Duration = Duration.Inf)

def get[T: ClassTag](key: String): Option[T]

def remove(key: String)

def getOrElse[A: ClassTag](key: String, expiration: Duration = Duration.Inf)(orElse: => A): A

}

Page 58: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

CacheAPI/CacheApi

• get…値の取得

• set…値の設定

• remove…値の削除

• getOrElse…値があれば取得、なければ値を指定したデフォルト値で更新して返す

Page 59: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

CacheAPI/CacheApi• 本質的にはこれらのメソッドを実装すれば、標準的なインタフェースでEhCache以外のキャッシュが使えます

• 簡単そう

• これをPlayのDependency Injectionの仕組みを活用して、Playモジュールにまとめ上げるのが最初大変かも?

Page 60: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.cache.CachePlugin

Page 61: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.cache.CachePlugin

• Play2.3までのキャッシュのインタフェース

• これを実装して標準外のキャッシュを提供

Page 62: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject.ApplicationLifecycle

Page 63: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

ApplicationLifecycle

• Play 2.4版play2-memcachedではPlay終了時にMemcachedクライアントのリソースを解放するため、ApplicationLifecycleを利用

• Play 2.3版まではPlugin中で同様の処理

• Play 2.4版からはMemcachedClientProviderで

Page 64: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

trait ApplicationLifecycle {

def addStopHook(hook: () => Future[Unit]): Unit

def addStopHook(hook: Callable[F.Promise[Void]]): Unit = {

import play.api.libs.iteratee.Execution.Implicits.trampoline

addStopHook(() => hook.call().wrapped().map(_ => ()))

}

}

Page 65: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

ApplicationLifecycle

• Play 2.4版play2-memcachedではPlay終了時にMemcachedクライアントのリソースを解放するため、ApplicationLifecycleを利用

Page 66: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

val lifecycle: play.api.inject.ApplicationLifecycle

val memcachedClient: net.spy.memcached.MemcachedClient

!!!

lifecycle.addStopHook(() => Future.successful { logger.info("Stopping MemcachedPlugin.") client.shutdown() })

Page 67: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

ApplicationLifecycle

• Play 2.3版まではPlugin中で同様の処理

• Play 2.4版からはMemcachedClientProviderで

Page 68: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

ApplicationLifecycle

• 詳しくは↓

https://github.com/playframework/playframework/blob/2.4.0-M2/framework/src/play/src/main/scala/play/api/inject/ApplicationLifecycle.scala

Page 69: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject.Module

Page 70: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject.Module• 型からインスタンスへのバインディングの集合体

• Playはモジュールを使って依存性を解決

Page 71: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.inject.Module• bind[CacheApi].to(new

MemcachedCacheApiProvider(…))で「CacheApiの実装はMemcachedApiProvider

から得られますよ」ということをPlayに伝える

• Playに「CacheApiの実装ください」というと、MemcachedApiProviderから得たCacheApiの実装を返す

Page 72: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールをつくりたくなってきましたね?

Page 73: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールをつくるときに参考になるソース

Page 74: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.cache.EhCacheModule• Play2.4標準のEhCacheベースのキャッシュを提供するModule

https://github.com/playframework/playframework/blob/2.4.0-M2/framework/src/play-cache/src/main/scala/play/api/cache/Cache.scala

• 実質的にリファレンス実装ですよね

Page 75: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play.api.cache.EhCachePlugin• Play 2.3まで標準のEhCacheベースのキャッシュを提供するPlugin

• https://github.com/playframework/playframework/blob/2.3.7/framework/src/play-cache/src/main/scala/play/api/cache/Cache.scala

• ModuleよりPlugin時代のほうがとっつきやすいと思うので、まずPlay 2.3向けにプラグイン書くことからはじめてもいいかも

Page 76: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

play2-memcachedのコード• https://github.com/mumoshu/play2-

memcached/tree/play-2.4/plugin/src/main/play_2.4/com/github/mumoshu/play2/memcached

Page 77: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールってどうなの?

• Playプラグインからモジュールに変わって、結局何がうれしいの?

Page 78: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールってどうなの?• Pluginに集中しがちだったコードが綺麗に別れる

• これまでPluginにはCacheAPI実装の提供と、Playのライフサイクルイベントにフックした処理、という2つの役割があった

• これがプラグイン以外のクラスに別れて、複雑なPlay2モジュールが作りやすくなってるはず

Page 79: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールってどうなの?

• これまでPlugin化されていないPlayのコア機能が多く、込み入った拡張ができないケースがあった

• Module導入を機に、DIできる箇所が増えた模様。結果的にModuleを使うと、いままでより込み入った拡張がしやすくなってると思われる

Page 80: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

trait Plugin { /** * Called when the application starts. */ def onStart() {} /** * Called when the application stops. */ def onStop() {} /** * Is the plugin enabled? */ def enabled: Boolean = true }

Page 81: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールってどうなの?

Page 82: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールってどうなの?• よさそう

Page 83: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

そろそろまとめ

Page 84: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

TODO• Moduleによる実行時の依存性解決だけでなく、コンパイル時に依存性解決にも対応する(CakePattern)

• 必須ではないがPlay2のドキュメントでも推奨されている

• https://www.playframework.com/documentation/2.4.0-M2/ScalaCompileTimeDependencyInjection

Page 85: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

TODO• Play 2.0.x, 2.1.x, 2.2.x, 2.3.x, 2.4.x向けのクロスビルド

• 2.3と2.4間で互換性のない変更があるので、同じソースではコンパイルエラー。ソースわけないとだめ

• 今はPlayバージョン毎にブランチを分けててメンテがつらい

Page 86: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

TODO

• Play 2.0.x, 2.1.x, 2.2.x, 2.3.x, 2.4.x向けのクロスビルド

• 最新ブランチでは以下のようにビルド仕分けられるようにした

PLAY_VERSION=2.3.0 sbt PLAY_VERSION=2.4.0-M2 sbt

Page 87: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

まとめ• Playプラグインは2.4からPlayモジュールに

• play.api.{cache, inject}パッケージ

• play.api.inject.{Module, ApplicationLifecycle}

• play.api.cache.CacheApi

• play2-memcachedはPlay 2.4に対応してます

Page 88: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

まとめ• コンパイル時の依存性解決に対応

• 複数バージョンのPlayとクロスビルドしたい

Page 89: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

Playモジュールをつくろう!

Page 90: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

We are hiring!https://crowdworks.co.jp/recruit/engineer/

Page 91: 2014/12/13 第1回 Scala関西勉強会 play2-memcached supports Play 2.4 ~Play 2.4モジュールのつくりかた~

質疑応答