【问题标题】:Scala-Play: How to create a Component with access to Application lifecycle events?Scala-Play:如何创建一个可以访问应用程序生命周期事件的组件?
【发布时间】:2018-02-13 15:50:29
【问题描述】:

我有一个 Scala-Play 2.5.x 应用程序,它实际上是一个“服务容器”,这意味着在某些服务规范下,用户可以热部署服务并且可以执行它们等。一些服务需要通用功能,例如连接到时间序列数据库,例如韩国开发银行。

我想在我的 Play 应用程序中定义知道应用程序何时开始和结束的组件,以便它们可以对其资源进行初始化和关闭。我还需要它们的“状态”,例如 KDB 连接,以便以无缝方式访问已部署的服务,即

  • 执行服务的请求被拦截
  • 检查服务“要求”,例如服务 X 需要访问特定的 KDB 连接
  • 服务通常被实例化并执行,注入使用 IoC 所需的 KDB 连接。

除了“组件”这个概念之外,我拥有上述所有内容。我查看了 Play 书籍,其中讨论了以前的 play.api.Plugin 特征,这是一个好的开始,即它有 onStart onEnd 等,但似乎这个界面在 2.5.x 中消失了。然后我检查了如何创建应用程序模块,但我看到的只是一个 Module 的子类,它覆盖了 def bindings,它做了一堆 IoC,但没有别的。如何覆盖我的应用程序组件的用例,该组件有权播放 Web 应用程序生命周期事件并可以为特定请求提供一些状态?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    来自手册:ScalaDependencyInjection 可以帮忙吗:

    import scala.concurrent.Future
    import javax.inject._
    import play.api.inject.ApplicationLifecycle
    
    @Singleton
    class MessageQueueConnection @Inject() (lifecycle: ApplicationLifecycle) {
      val connection = connectToMessageQueue()
      lifecycle.addStopHook { () =>
        Future.successful(connection.stop())
      }
    
      //...
    }
    

    这是 Play 2.5 和 2.6 的方式。

    【讨论】:

    • 好的哇非常简单的方法是的。因此,我基本上会在需要访问控制器类中的连接的任何地方注入MessageQueueConnection ...
    • 我会这样做,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多