Scala - 如何停止使用akka调度程序执行的期货

时间:2014-11-26 21:32:29

标签: scala akka scheduler kill future

这是我第一次在这里提问,而且我对scala相对较新。 我有以下代码:

implicit val context = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
val system = ActorSystem("My System")

val update = future {
  def doSomething(args...) = {
    // Do Stuff
  }

  val result = system.scheduler.schedule(Duration.create(delay, TimeUnit.MILLISECONDS),
    Duration.create(interval, TimeUnit.MILLISECONDS))(doSomething(args...))
}

我需要多次执行doSomething函数,上面的代码符合我的需要,但在某些情况下我需要停止它。

所以我的问题是什么是停止调度程序的最佳方法? 提前谢谢。

2 个答案:

答案 0 :(得分:4)

为什么在Future中有调度程序?我相信您可以使用Java Timer任务执行相同操作而无需创建ActorSystem。我的意思是当你不使用Actors的核心功能时,我不明白为什么你想使用Actors来调用Future。也许我错过了什么。

这是一种做法。您可以向取消调度程序的actor发送消息cancelSomethingMsg。调度程序本身以预定的频率向自己发送消息。

object MyActor {
   case object doSomethingMsg
   case object cancelSomethingMsg 
}

class MyActor extends Actor {
  private var cancellable: Option[Cancellable] = None

  override def preStart() = {
    //schedule a message doSomethingMsg to self every 5 seconds
    cancellable = Option(context.system.scheduler.schedule(5 seconds, duration, self, doSomethingMsg))
  }

  override def postStop() = {
    cancellable.foreach(_.cancel())
    cancellable = None
  }

  def doSomethingF = { future {//make sure you don't close over mutable state of the actor inside this Future} }

  def receive = {
     case doSomethingMsg => doSomethingF() 
     case doCancelMsg => cancellable.foreach(_.cancel())

  }    
}

答案 1 :(得分:2)

您的结果val属于Cancellable类型,您可以取消它。但我相信它会在执行之间取消,而不是在执行doSomething方法

时取消