【问题标题】:How to access a variable in a singleton class used by a module in Play 2.5 scala如何访问 Play 2.5 scala 中模块使用的单例类中的变量
【发布时间】:2017-03-29 08:15:52
【问题描述】:

我在 Play Framework 2.5 中使用 akka quartz (https://github.com/theatrus/akka-quartz) 制作了一个调度程序

一切都很好,直到我想取消工作 因为我无法访问包含 Cancelable 对象的变量。

下面是代码:

这是针对模块的

RecurrentTaskModule.scala

class RecurrentTaskModule extends AbstractModule with AkkaGuiceSupport {
    override def configure() = {
        bindActor[WeatherHistoryApiActor]("weather-history-api-call")
        bind(classOf[RecurrentTask]).asEagerSingleton()
   }
}

@Singleton
class RecurrentTask @Inject() (actorSystem: ActorSystem, 
@Named("weather-history-api-call") val weatherHistoryApiActor: ActorRef,
lifecycle: ApplicationLifecycle, scheduleModel: TxScheduleModel) {
    var scheduleMap: Map[String, Cancellable] = _
    val f = quartzActor ? AddCronSchedule(actorRef,
                    "%d %s %s %s %s %s".format(0,"*","*","*","*","*",
                    Message(""),true)

  val r = Await.result(f, timeout.duration).asInstanceOf[AddCronScheduleResult]
    r match {
        case AddCronScheduleSuccess(cancel: Cancellable) => {
            scheduleMap.put("%s".format(schedule._1), cancel)
        }
        case AddCronScheduleFailure(reason: Throwable) => {
        }
    }
}

在我的配置中

application.conf

play.modules.enabled += "tasks.RecurrentTaskModule"

如您所见,如果我可以访问

var scheduleMap

我可以通过调用地图中的可取消对象轻松取消作业

顺便说一句,我想在我的 Application.scala(控制器)中访问它

【问题讨论】:

  • 您是否将RecurrentTask 注入到您的Application 控制器中?
  • 哦,我的上帝.....我只是假设你不能那样做......我认为模块看起来很特别...... ugghh..你能创建一个答案以便我接受吗?

标签: scala playframework akka


【解决方案1】:

您可以将 RecurrentTask 单例注入到您的控制器实例中:

class Application @Inject() (recurrentTask: RecurrentTask) {

【讨论】:

  • 非常感谢!我只是认为这是不可能的,因为我之前尝试过,但我想我注入了 RecurrentTaskModule .. @_@
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 2017-06-18
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
相关资源
最近更新 更多