【问题标题】:How do I initialize an eager singleton without requiring a controller request in Play?如何在 Play 中不需要控制器请求的情况下初始化一个急切的单例?
【发布时间】:2016-05-06 04:03:08
【问题描述】:

在基于 Scala 的 Play 应用程序中,我正在尝试启动单例服务,而不需要向控制器发出请求。我按照2.4 API documentation 中的说明创建了一个单例类,然后使用 Guice 的依赖注入库将该类绑定为 eager 单例。

即使使用急切绑定,在我通过控制器路由收到请求之前,仍然不会调用单例。关于我做错了什么有什么想法吗?

模块

package models

import com.google.inject.AbstractModule
import com.google.inject.name.Names

class MessageLogModule extends AbstractModule {
  def configure() = {
    bind(classOf[MessageLogService]).asEagerSingleton
  }
}

配置

play.modules.enabled += "models.MessageLogModule"

单例

package models

import javax.inject._

@Singleton
class MessageLogService {
  // Create a file to test
  println("IN SINGLETON - CREATING NEW FILE")
  val file = new java.io.File("howdy.txt")
  file.createNewFile
}

运行命令

sbt compile run

直到我发出...

curl http://localhost:9000/

我想要的是 MessageLogService 在运行服务时启动,而不是等待请求到达控制器路由。

【问题讨论】:

  • 你试过“sbt compile start”吗? Run 在开发过程中做了一些技巧。
  • @AlvaroCarrasco 太棒了!就是这样!您能否将其发布为官方答案,以便我将其设为“已回答”并给予您信任?
  • 对于遇到此问题的任何其他人,这里有一篇讨论 run 和 start 之间差异的帖子:stackoverflow.com/questions/18213427/…

标签: scala playframework playframework-2.0 guice


【解决方案1】:

你想要的是:sbt compile start

run 将编译和初始化延迟到第一次请求,以加快更改-刷新-查看-更改开发周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多