如何访问Play 2.5 scala中模块使用的单例类中的变量

时间:2017-03-29 08:15:53

标签: scala playframework akka

我使用akka quartz(https://github.com/theatrus/akka-quartz

在Play Framework 2.5中创建了一个调度程序

在我想要取消工作之前,一切都很好 因为我无法访问持有Cancellable对象的变量。

以下是代码:

这是针对模块的

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(控制器)

中访问它

1 个答案:

答案 0 :(得分:1)

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

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