バッチをつくるにあたり、Play Framework は使えるのかといったあたりを調べてみた。
メリデメ
Play2.0で作ったアプリの中にバッチ的コマンドラインアプリを組み込んでみる - argius note
メリット
機能の再利用ができる(特にDAO)
新しいプロジェクトを作らなくて済む
デプロイの手間が省ける
デメリット
サーバプロセスでないので、起動が遅い(常駐化すればOK?)
加えて Play 向けのライブラリが使えたり、たしかにメリットはありそう、な気がする。
どんな感じでやるか
こんな感じで、Akka の Actor ベースでつくれるっぽい。
ScheduledTasks - 2.6.x
http サーバーが起動してしまうのがイマイチ感ある、と思い、
- SettingsAkkaHttp - 2.6.x
play
-server
-http
-port = disabled
で対応可能な気がする- うまくいかない・・・
run -Dhttp.port=disabled
してみたが、You have to specify https.port when http.port is disabled
と怒られるので、これは https オンリーなアプリにするための設定みたいだ。なので今回のようなケースでは使えない
ハマりポイント
Play を開発モードで起動した場合は1回リクエストが必要
- Play アプリケーションを開発モードで起動した場合、初回アクセスしないと Play の初期化などが走らないので、スケジュール実行をしかけた Actor も動作しなかった
- 当然ながらプロダクションモードで起動した場合はこのようなハマりはない
- 回避策はないし、可能になる見込みもなさげ・・・
本番環境向け設定
何もせずに sbt start
するとこんなエラーが出た。
Oops, cannot start the server.
Configuration error: Configuration error[
The application secret has not been set, and we are in prod mode. Your application is not secure.
To set the application secret, please read http://playframework.com/documentation/latest/ApplicationSecret
]
at play.api.Configuration$.configError(Configuration.scala:155)
at play.api.Configuration.reportError(Configuration.scala:984)
at play.api.http.HttpConfiguration$.getSecretConfiguration(HttpConfiguration.scala:237)
:
ApplicationSecret - 2.6.x
を読むと、ApplicationSecret
というものが必要らしい。
playGenerateSecret
でシークレットキーが生成できる。
$ sbt
> playGenerateSecret
[info] Generated new secret: ;fg2>T_0B8toLR?Vg]p</MO3E?]AiHwGWQr9=`tXbzLDJDgiVrZE_areHAORn4Jx
[success] Total time: 0 s, completed Jul 6, 2017 9:14:21 PM
直接 application.conf
に書き込むには playUpdateSecret
する。
$ playUpdateSecret
[info] Generated new secret: _xyvgmynN]>Mq_bh;i^zsV5A[k0/gWZ`vNG^zV0KFNjcD?]6]P54nWfxv?2vIJy@
[info] Updating application secret in /Users/ryu/Projects/__try/play-batch-trial/conf/application.conf
[warn] Did not find application secret in /Users/ryu/Projects/__try/play-batch-trial/conf/application.conf
[warn] Adding application secret to start of file
[success] Total time: 0 s, completed Jul 6, 2017 9:15:01 PM
トラブルシューティング
- [Scala, Play Framework, IntelliJ] IntelliJ IDEA(無償版)でScala+PlayFrameworkをインポートするとview.html.indexでエラー - TERAKOYA
- IntelliJ IDEA CE を
2017.1
版に新しくしたら何の問題もなくなった
- IntelliJ IDEA CE を