【问题标题】:How to execute action on Play framework startup?如何在 Play 框架启动时执行操作?
【发布时间】:2018-02-01 13:38:08
【问题描述】:

我有这个应用程序使用带有 Scala 的 Play 框架,我希望有一个服务在我的应用程序启动时执行一个方法。我正在做How do I perform an action on server startup in the Scala Play Framework? 所说的一切。我的 Play 版本是 2.6,我没有为此使用 GlobalSettings。

package bootstrap
import com.google.inject.AbstractModule
class EagerLoaderModule extends AbstractModule {
  override def configure() = {
    println("EagerLoaderModule.configure")
    bind(classOf[InitSparkContext]).to(classOf[InitSparkContextImpl]).asEagerSingleton()
  }
}

application.conf 上,我添加了play.modules.enabled += "bootstrap.EagerLoaderModule" 行。下面是我要启动 Spark 上下文的服务。

package bootstrap

import javax.inject.{Inject, Singleton}
import play.api.inject.ApplicationLifecycle
import scala.concurrent.Future

trait InitSparkContext {
  def init(): Unit
  def stop(): Unit
}

@Singleton
class InitSparkContextImpl @Inject()(appLifecycle: ApplicationLifecycle) extends InitSparkContext {

  override def init(): Unit = println("InitSparkContext.start")
  override def stop(): Unit = println("InitSparkContext.stop")
  appLifecycle.addStopHook { () =>
    stop()
    Future.successful(())
  }
  init()
}

控制台上没有打印任何内容,甚至没有打印println("EagerLoaderModule.configure")....

【问题讨论】:

  • 您注册新的EagerLoaderModule了吗?见playframework.com/documentation/2.6.x/…
  • 您是指play.modules.enabled += "bootstrap.EagerLoaderModule" 吗?我按照问题中的解释做了......
  • 我假设您正在使用sbt run,然后向应用程序发送请求。对吗?
  • 是的,我在sbt run之后发送请求。
  • 我会尝试将此类注入到您的一个控制器中,以确保它可以这样工作。如果可行,请尝试检查模块是否已加载(不确定是否有日志记录,我可能只是附加一个调试器)。

标签: scala playframework


【解决方案1】:

您不能在 play 应用程序上使用 println,您需要设置一个 Logger。所以:

val log = play.api.Logger(getClass)
log.info("This happened")

然后你可以使用 logback 文件来配置你的日志文件: 以下是有关如何配置它的一些详细信息: https://www.playframework.com/documentation/2.6.x/SettingsLogger

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 2013-01-15
    • 2015-12-11
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多