在应用程序启动时阻止线程可以吗?

时间:2017-10-04 18:07:31

标签: scala playframework

在我的Play应用中,我在Module.configure()中执行此操作:

   bind(classOf[GadgetsReader]).toInstance(GadgetsCsvReader)
   bind(classOf[Gadgets]).asEagerSingleton()

然后,我这样做:

@Singleton
class Gadgets @Inject()(reader: GadgetsReader)  {
  val all:Seq[Gadget] = reader.readGadgets() 
}

在Play的渲染线程中,它会在启动时将CSV文件中的大量小工具同步加载到内存中。

我没有在Play示例中的任何地方看到类似的场景。我想知道我在做什么是惯用的Scala& amp;播放。

是否可以像这样同步加载一个非常大的文件,因为我不想在数据完全加载之前提供任何请求?

我创建一个Gadgets类然后注入它而不是静态/对象方法Gadget.all这是一件好事吗?

GadgetGadgets类应该位于model吗?

任何其他评论也将受到赞赏。

1 个答案:

答案 0 :(得分:3)

我想这取决于你想要你的创业有多大,多快等等。一般来说,我会说是的,即使Akka的集群分片已经(或者至少,最后我读过,有)阻塞调用在返回之前等待初始化完成。在你的情况下,它可能很好,但是一个阻塞调用这样的阻塞通常意味着执行IO,IO可能会失败(例如,如果你从网络文件系统读取,并且当你启动时网络出现故障) ?)。所以有时,最好设计你的应用程序,使其能够响应(可能具有不可用的状态)而不进行操作,并且异步执行该操作,并在失败的情况下重试等。但也许这对你的情况来说太过分了。

回答你的其他问题 - 是的,依赖注入Gadgets肯定比使用静态单例更好,这意味着你可以控制Gadgets的创建方式(也许你可能想要初始化它)在测试中有所不同。)

model包中可能会很好,但这在很大程度上取决于您的域名及其外观。