§アプリケーションへのPekko Httpサーバーの埋め込み
Playアプリケーションは通常、独自のコンテナとして使用されますが、既存のアプリケーションにPlayサーバーを埋め込むこともできます。これは、TwirlテンプレートコンパイラとPlayルートコンパイラと組み合わせて使用できますが、これらはもちろん必須ではありません。一般的なユースケースは、ごく少数のシンプルなルートのみを持つアプリケーションです。Pekko HTTPサーバーを埋め込むには、次の依存関係が必要です。
libraryDependencies ++= Seq(
pekkoHttpServer
)
Play Pekko HTTPサーバーを起動する1つの方法は、PekkoHttpServer
ファクトリメソッドを使用することです。必要なのは単純なルートを提供することだけである場合、fromRouterWithComponents
メソッドと組み合わせて文字列補間ルーティングDSLを使用することを検討できます。
import play.api.mvc._
import play.api.routing.sird._
import play.core.server.PekkoHttpServer
val server = PekkoHttpServer.fromRouterWithComponents() { components =>
import Results._
import components.{ defaultActionBuilder => Action }
{
case GET(p"/hello/$to") =>
Action {
Ok(s"Hello $to")
}
}
}
デフォルトでは、これは本番モードでポート9000でサーバーを起動します。ServerConfig
を渡すことでサーバーを構成できます。
import play.api.mvc._
import play.api.routing.sird._
import play.core.server.PekkoHttpServer
import play.core.server._
val server = PekkoHttpServer.fromRouterWithComponents(
ServerConfig(
port = Some(19000),
address = "127.0.0.1"
)
) { components =>
import Results._
import components.{ defaultActionBuilder => Action }
{
case GET(p"/hello/$to") =>
Action {
Ok(s"Hello $to")
}
}
}
Playは、ルーター以外のコンポーネントのカスタマイズも容易にするコンポーネントトレイトを提供します。この目的のためにPekkoHttpServerComponents
トレイトが提供されており、BuiltInComponents
と組み合わせて、必要なアプリケーションを構築できます。この例では、PekkoHttpServerComponents with BuiltInComponents with NoHttpFiltersComponents
と同等のDefaultPekkoHttpServerComponents
を使用します。
import play.api.http.DefaultHttpErrorHandler
import play.api.mvc._
import play.api.routing.Router
import play.api.routing.sird._
import play.core.server.DefaultPekkoHttpServerComponents
import scala.concurrent.Future
val components = new DefaultPekkoHttpServerComponents {
override lazy val router: Router = Router.from {
case GET(p"/hello/$to") =>
Action {
Results.Ok(s"Hello $to")
}
}
override lazy val httpErrorHandler: DefaultHttpErrorHandler = new DefaultHttpErrorHandler(
environment,
configuration,
devContext.map(_.sourceMapper),
Some(router)
) {
protected override def onNotFound(request: RequestHeader, message: String): Future[Result] = {
Future.successful(Results.NotFound("Nothing was found!"))
}
}
}
val server = components.server
ここで実装する必要があるメソッドはrouter
だけです。その他すべてには、上記のhttpErrorHandler
の場合のように、メソッドをオーバーライドすることでカスタマイズできるデフォルトの実装があります。サーバー構成は、serverConfig
プロパティをオーバーライドすることでオーバーライドできます。
サーバーを起動したら停止するには、単にstop
メソッドを呼び出します。
server.stop()
注記:Playは起動するためにアプリケーションシークレットの構成を必要とします。これは、アプリケーションに
application.conf
ファイルを提供するか、play.http.secret.key
システムプロパティを使用して構成できます。
別の方法は、fromApplication
メソッドと組み合わせてGuiceApplicationBuilder
を使用してPlayアプリケーションを作成することです。
import play.api.mvc._
import play.api.routing.sird._
import play.core.server.PekkoHttpServer
import play.core.server.ServerConfig
import play.filters.HttpFiltersComponents
import play.api.Environment
import play.api.ApplicationLoader
import play.api.BuiltInComponentsFromContext
val context = ApplicationLoader.Context.create(Environment.simple())
val components = new BuiltInComponentsFromContext(context) with HttpFiltersComponents {
override def router: Router = Router.from {
case GET(p"/hello/$to") =>
Action {
Results.Ok(s"Hello $to")
}
}
}
val server = PekkoHttpServer.fromApplication(
components.application,
ServerConfig(
port = Some(19000),
address = "127.0.0.1"
)
)
§ロギング構成
Pekko HTTPを埋め込みサーバーとして使用する場合、デフォルトではロギング依存関係は含まれません。埋め込みアプリケーションにもロギングを追加する場合は、Play Logbackモジュールを追加できます。
libraryDependencies ++= Seq(
logback
)
そして後でLoggerConfigurator
APIを呼び出します。
import play.api.mvc._
import play.api.routing.sird._
import play.filters.HttpFiltersComponents
import play.core.server.PekkoHttpServer
import play.core.server.ServerConfig
import play.api.Environment
import play.api.ApplicationLoader
import play.api.LoggerConfigurator
import play.api.BuiltInComponentsFromContext
val context = ApplicationLoader.Context.create(Environment.simple())
// Do the logging configuration
LoggerConfigurator(context.environment.classLoader).foreach {
_.configure(context.environment, context.initialConfiguration, Map.empty)
}
val components = new BuiltInComponentsFromContext(context) with HttpFiltersComponents {
override def router: Router = Router.from {
case GET(p"/hello/$to") =>
Action {
Results.Ok(s"Hello $to")
}
}
}
val server = PekkoHttpServer.fromApplication(
components.application,
ServerConfig(
port = Some(19000),
address = "127.0.0.1"
)
)
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムでコミュニティとの会話を開始してください。