Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Play 2.3 から 2.4 へアップデートした話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
tsuyoshi yoshizawa
July 05, 2015
Technology
3.1k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Play 2.3 から 2.4 へアップデートした話
Play meetup 2 で発表した内容です。
https://playframeworkja.doorkeeper.jp/events/27023
tsuyoshi yoshizawa
July 05, 2015
More Decks by tsuyoshi yoshizawa
See All by tsuyoshi yoshizawa
Scala Fukuoka Play 25 2016
tsuyoshizawa
2
2.3k
seasar_conf_2015.pdf
tsuyoshizawa
3
2.8k
Other Decks in Technology
See All in Technology
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
9
4k
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
300
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
480
SREとQA 二人三脚で進めるSLO運用/sre-qa-slo
sugitak
0
960
CIで使うClaude
iwatatomoya
0
290
「早く出す」より「事業に効く」 ── 顧客の業務サイクルから逆算するAI時代の二重ループ開発と「変化の設計者」 / devsumi2026
rakus_dev
1
400
AI時代のPlaywright活用(システムテストを自動化する ー 実行エンジンにPla ywrightを選んだ理由)
ynisqa1988
1
500
生成AI×AWS CDK×AWS FISで"振り返れる"ミニGameDayをつくろう
yoshimi0227
1
410
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3.6k
AI時代の闇と光
tatsuya1970
0
110
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
3
4.2k
AI Driven AI Governance
pict3
0
490
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
350
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
How GitHub (no longer) Works
holman
316
150k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
It's Worth the Effort
3n
188
29k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
350
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
A better future with KSS
kneath
240
18k
Chasing Engaging Ingredients in Design
codingconduct
0
240
Practical Orchestrator
shlominoach
191
11k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
810
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 ͔Β࢝ΊΔਓݹ͍ใʹΘ͞Εͳ͍ Α͏ʹ