ドキュメント

§アプリケーションへの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"
  )
)

次へ:Nettyサーバーを使用したPlayの埋め込み


このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムでコミュニティとの会話を開始してください。