Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Play 2.3 から 2.4 へアップデートした話
tsuyoshi yoshizawa
July 05, 2015
Technology
7
2.9k
Play 2.3 から 2.4 へアップデートした話
Play meetup 2 で発表した内容です。
https://playframeworkja.doorkeeper.jp/events/27023
tsuyoshi yoshizawa
July 05, 2015
Tweet
Share
More Decks by tsuyoshi yoshizawa
See All by tsuyoshi yoshizawa
Scala Fukuoka Play 25 2016
tsuyoshizawa
2
1.5k
seasar_conf_2015.pdf
tsuyoshizawa
3
2.5k
Other Decks in Technology
See All in Technology
Citizen 개발기
outsider
0
240
Data in Google I/O - IO Extended GDG Seoul
kennethanceyer
0
150
Implementing Kubernetes operators in Java with Micronaut - TechWeek Java Summit 2022
alvarosanchez
0
120
Retca Cloud
bau
0
470
Autonomous Database Cloud 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
10
18k
ソフトウェアテスト 2022 / Software Testing 2022
ak1210
1
1.8k
現状のFedCMの動作解説と OIDCとの親和性について- OpenID TechNight vol.19
ritou
2
450
サーバレスECにおける Step Functions の使い方 〜ステートマシン全部見せます!〜
miu_crescent
0
190
Building smarter apps with machine learning, from magic to reality
picardparis
4
3.2k
JUnit5.7, 5.8の新機能紹介 #jjug_ccc #jjug_ccc_b / junit 5.7, 5.8 new features
kyonmm
PRO
2
420
OpsJAWS Meetup21 システム運用アンチパターンのすすめ
yoshiiryo1
0
1.4k
覗いてみよう!現場のスクラムチーム
tkredman
0
1k
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
62
7.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Statistics for Hackers
jakevdp
781
210k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.4k
Raft: Consensus for Rubyists
vanstee
126
5.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
15
36k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
Web development in the modern age
philhawksworth
197
9.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
396
62k
Support Driven Design
roundedbygravity
86
8.5k
Stop Working from a Prison Cell
hatefulcrawdad
261
17k
How to train your dragon (web standard)
notwaldorf
58
3.9k
Transcript
Play 2.3 ͔Β Play 2.4 ʹ্͛ͨ - Play meetup 2
-
ࣗݾհ Tsuyoshi Yoshizawa ussy00 tsuyoshizawa scala-oauth2-provider ϝϯςͯ͠·͢ גࣜձࣾψʔϥϘͰ Typetalk ͱ͍͏
chat αʔ ϏεΛ Play Ͱͭͬͯ͘·͢
Play 2.4 ʹͯ͠ ຊ൪ڥͰͳ͘Քಇ ࡉ͔͍όάग़͍ͯͯɺطʹ 2.4.2 ·ͰϦϦʔε [2.4] Still a
thread leak in development environment https://github.com/playframework/playframework/issues/4649
2.4 ͰԿ͕มΘͬͨͷ͔ • Dependency Injection ͷαϙʔτ • Plugin ͔Β Module
• i18n ͷΈ͕มߋ • ઃఆΩʔͷมߋ What’s new in Play 2.4 https://playframework.com/documentation/2.4.x/Highlights24 Play 2.4 Migration Guide https://playframework.com/documentation/2.4.x/Migration24
Dependency Injection Controller ʹίϯϙʔωϯτΛ DI ͢ΔʹɺΠϯε λϯελΠϓΛ object ͔Β class
ʹมߋ͢Δඞཁ͋Γ Guice Λͬͯ DI ʢJSR 330 ϕʔεʣ import javax.inject._ import play.api.libs.ws._ class MyComponent @Inject() (ws: WSClient) { // ... }
Module Plugin ඇਪʹͳΓɺ DI ϕʔεͳ Module ʹ Ҡߦ͍ͯ͘͠ඞཁ͋Γ Play 2.4
ͷ Module ͷ࡞Γํͱ Plugin ͔ΒͷҠߦ ʹ͍ͭͯ http://tototoshi.hatenablog.com/entry/2014/12/14/170745
i18n Messages ʹ͢ܕ͕ Lang ͔Β Messages ࠃࡍԽରԠͯ͠ΔͱόʔδϣϯΞοϓ͕໘ case class Messages(lang:
Lang, messages: MessagesApi) object Messages { def apply(key: String, args: Any*)(implicit messages: Messages): String
ઃఆΩʔͷมߋ • ઃఆ͕ແࢹ͞ΕΔΘ͚Ͱͳ͍ • ࣮ߦ࣌ʹܯࠂ͕ग़ྗ͞Εͯؾ͚ͮΔΈ͋Γ • ৽͍͠ͷʹஔ͖͍͑ͯ͘ application.secret session.*
play.crypto.secret play.http.session.*
ΞοϓάϨʔυ
ݱঢ়ͷ֬ೝ • ෳਓͰ Git Λͬͯฒߦ։ൃΛ͍ͯ͠Δ • ͋Δఔେ͖͍ϒϥϯν͋Δ • ϓϩδΣΫτதنఔ •
ͦΕͳΓʹमਖ਼ൣғେ͖͘ͳΓͦ͏ • Play 2.4 ఆҠߦͰ͖ΔͷΛఏڙ͍ͯ͠Δ
ஈ֊తΞοϓάϨʔυ 1. Play 2.3 ελΠϧͰɺ·ͣίϯύΠϧΛ௨͢ 2. ςετΛ௨͠ಈ࡞֬ೝͯ͠ίϛοτ 3. Play 2.4
ελΠϧʹগͣͭ͠Ҡߦ͍ͯ͘͠ ΞοϓάϨʔυ ා͘ͳ͍
ࣗ࡞ϓϥάΠϯͷҠߦ Redis ΛΩϟογϡʹ͏ͨΊʹ Plugin Λࣗ࡞ (scala-redis Λར༻) class RedisModule extends
Module { def bindings(environment: Environment, configuration: Configuration) = Seq( bind[CacheApi].to[RedisCacheApi] ) } play.modules.enabled += "modules.RedisModule" play.modules.disabled += "play.api.cache.EhCacheModule" build.sbt
ScalikeJDBC Play Support play.modules.enabled += "scalikejdbc.PlayDBApiAdapterModule" db {
default { driver = org.postgresql.Driver url = "jdbc:postgresql://localhost/test" username = test password = test hikaricp { poolName = "play" registerMbeans = true } } } HikariCP ͷઃఆΛར༻͔ͨͬͨ͠ͷͰ scalikejdbc-play-dbapi-adapter Λར༻ 2.4 ͔Β HikariCP
application.conf
Thread pool configuration akka { actor {
default-‐dispatcher { fork-‐join-‐executor { parallelism-‐min = 300 parallelism-‐max = 300 } } } } play { akka { actor { default-‐dispatcher = { fork-‐join-‐executor { parallelism-‐min = 300 parallelism-‐max = 300 } } } } } 2.3 2.4 Akka ͱಉ͡هड़ʹͳͬͨ http://doc.akka.io/docs/akka/2.3.11/general/configuration.html
Remote address औಘ trustxforwarded=true 2.3 ·ͰϦόʔεϓϩΩγΛհ͢Δͱ͖ʹɺҎ ԼͷઃఆΛ͢Δඞཁ͕͕͋ͬͨෆཁʹ 2.4 ͔Β x-forwarded
ʹՃ͑ͯ RFC7239 αϙʔ τɻ play.http.forwarded.version ͰΓସ͑Մೳ https://www.playframework.com/documentation/2.4.x/HTTPServer
i18n
i18n ରԠ Controller ͷΠϯελϯελΠϓ͕ object ͷ߹ s/implicit lang: Lang/implicit messages:
Messages/g import play.api.play.current import play.api.i18n.Messages.Implicits._ Lang ͔Β Messages ʹ҉తมΛߦͬͯ͘ΕΔ Controller ʹҎԼͷ 2 ߦΛՃ͢Δ
withLang/clearingLang object FooController extends Controller with LegacyI18nSupport val lang =
user.toLang Ok(Messages("hello.world")).withLang(lang) trait LegacyI18nSupport { implicit class ResultWithLang(result: Result)(implicit messagesApi: MessagesApi) { def withLang(lang: Lang): Result = messagesApi.setLang(result, lang) def clearingLang: Result = messagesApi.clearLang(result) } } ҉తʹ messagesApi Λݺͼग़ͯ͘͠ΕΔ Result ͔Β MessagesApi ʹҠಈ͍ͯ͠Δ
ࢦ͖͢ 2.4 style import javax.inject.Inject import play.api.i18n.{MessagesApi, I18nSupport}
import play.api.mvc.Controller class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { } Controller ʹ MessagesApi Λ DI ͯ͠ i18nSupport Λ mixin RequestHeader Λ Messages ʹ҉తʹม͢Δ
class Controller GET /
@controllers.Application.index 2.3 ํࣜͰ @ Λ͚ͭΔ͜ͱͰಛఆͷ Controller ͔ Β class Խ͍ͯ͘͜͠ͱ͕Մೳ routesGenerator := InjectedRoutesGenerator routes build.sbt 2.4 ඪ४ͷΓํɻ Controller ͯ͢ class
2.4 style ʹ͚ͯ
Removing GlobalSettings GlobalSettings HttpErrorHandler HttpRequestHandler HttpFilter ApplicationLifecycle GlobalSettings 2.4
Ͱ Ҿ͖ଓ͖ར༻Ͱ͖Δ͕ɾɾɾ
ApplicationLifecyle @Singleton class IntervalJobs @Inject() ( system:
ActorSystem, lifecycle: ApplicationLifecycle) { val minuteJob = system.scheduler.schedule(1.minutes, 1.minutes) { // … } lifecycle.addStopHook { () => Future.successful(minuteJob.cancel()) } } • GlobalSettings#onStart • DI ରΫϥεͷίϯετϥΫλ • GlobalSettings#onStop • ApplicationLifecycle#addStopHook
HttpErrorHandler class ErrorHandler @Inject() ( env: Environment,
config: Configuration, sourceMapper: OptionalSourceMapper, router: Provider[Router], val messagesApi: MessagesApi ) extends DefaultHttpErrorHandler(env, config, sourceMapper, router) with I18nSupport { def onBadRequest(request: RequestHeader, message: String) = ??? def onForbidden(request: RequestHeader, message: String) = ??? def onNotFound(request: RequestHeader, message: String) = ??? def onOtherClientError(request: RequestHeader, statusCode: Int, message: String) = ??? def onServerError(request: RequestHeader, exception: Throwable) = ??? } DefaultHttpErrorHandler Λܧঝ͢ΔͱҠߦ͍͢͠ I18nSupport ΛͬͯΤϥʔը໘ͷࠃࡍԽରԠՄ
͍ͭ·ͰʹҠߦͨ͠Β͍͍ͷ͔ʁ
Play Roadmap 3.0 Play 3 Implementation Plan https://docs.google.com/document/d/1OejviUX5TDlRVeKg1JD9L4qh2Tn21giItmyxRXCydN0/edit Play 3.0.0
1st June 2016 Remove global state Play 2.5.0 1st October 2015 Deprecate every API that relies on global state for which there exists a DI alternative.
·ͱΊ • վળ͞Ε͍ͯ͘ Play • Play 2.4 3.0 ʹ͚ͨελʔτ
• Play νʔϜҠߦΛߟྀͯ͘͠Ε͓ͯΓɺஈ֊ తʹΞοϓάϨʔυՄೳ • Play 2.4 ͔Β࢝ΊΔਓݹ͍ใʹΘ͞Εͳ͍ Α͏ʹ