ドキュメント

§アプリケーションへのNettyサーバーの埋め込み

Playアプリケーションは、通常、独自のコンテナとして使用されますが、既存のアプリケーションにPlayサーバーを埋め込むこともできます。これは、TwirlテンプレートコンパイラとPlayルートコンパイラと組み合わせて使用できますが、もちろん必須ではありません。一般的なユースケースは、単純なルートが少数のアプリケーションです。Nettyサーバーを埋め込んで使用するには、次の依存関係が必要です。

libraryDependencies ++= Seq(
  nettyServer
)

Play Nettyサーバーを起動する1つの方法は、NettyServerファクトリメソッドを使用することです。単純なルートを提供するだけで済む場合は、fromRouterWithComponentsメソッドと組み合わせて文字列補間ルーティングDSLを使用することを決定する場合があります。

import play.api.mvc._
import play.api.routing.sird._
import play.core.server._

val server = NettyServer.fromRouterWithComponents() { components =>
  import components.{ defaultActionBuilder => Action }
  {
    case GET(p"/hello/$to") =>
      Action {
        Results.Ok(s"Hello $to")
      }
  }
}

デフォルトでは、これは本番モードでポート9000でサーバーを起動します。ServerConfigを渡すことで、サーバーを設定できます。

import play.api.mvc._
import play.api.routing.sird._
import play.core.server._

val server = NettyServer.fromRouterWithComponents(
  ServerConfig(
    port = Some(19000),
    address = "127.0.0.1"
  )
) { components =>
  import components.{ defaultActionBuilder => Action }
  {
    case GET(p"/hello/$to") =>
      Action {
        Results.Ok(s"Hello $to")
      }
  }
}

Playはまた、ルーター以外にも他のコンポーネントをカスタマイズすることを容易にするコンポーネントトレイトを提供します。NettyServerComponentsトレイトはこの目的のために提供されており、BuiltInComponentsと組み合わせて必要なアプリケーションを構築できます。この例では、DefaultNettyServerComponentsを使用します。これは、NettyServerComponents with BuiltInComponents with NoHttpFiltersComponentsと同等です。

import play.api.http.DefaultHttpErrorHandler
import play.api.mvc._
import play.api.routing.Router
import play.api.routing.sird._
import play.core.server._

import scala.concurrent.Future

val components = new DefaultNettyServerComponents {
  lazy val 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.successful(Results.NotFound("Nothing was found!"))
      }
    }
}
val server = components.server

ここで実装する必要がある唯一のメソッドはrouterです。その他のすべてには、上記のhttpErrorHandlerの場合のように、メソッドをオーバーライドすることでカスタマイズできるデフォルトの実装があります。サーバー構成は、serverConfigプロパティをオーバーライドすることでオーバーライドできます。

サーバーを起動した後に停止するには、単にstopメソッドを呼び出します。

server.stop()

注: Playを起動するには、アプリケーションシークレットを設定する必要があります。これは、アプリケーションでapplication.confファイルを提供するか、play.http.secret.keyシステムプロパティを使用して設定できます。

§ロギング設定

Nettyを埋め込みサーバーとして使用する場合、デフォルトではロギングの依存関係は含まれません。埋め込みアプリケーションにもロギングを追加する場合は、Play logbackモジュールを追加できます。

libraryDependencies ++= Seq(
  logback
)

その後、LoggerConfigurator APIを呼び出します。

import play.api.mvc._
import play.api.routing.Router
import play.api.routing.sird._
import play.api._
import play.core.server._

val environment = Environment.simple(mode = Mode.Prod)
val context     = ApplicationLoader.Context.create(environment)

// Do the logging configuration
LoggerConfigurator(context.environment.classLoader).foreach {
  _.configure(context.environment, context.initialConfiguration, Map.empty)
}

val components = new DefaultNettyServerComponents {
  override def router: Router = Router.from {
    case GET(p"/hello/$to") =>
      Action {
        Results.Ok(s"Hello $to")
      }
  }
}

val server = components.server

次: 一般的なトピック


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