0
我有一個Play
插件執行的方法是這樣每隔15秒:如何防止返回一個有前途的方法被調用,直到先前調用未完成
import scala.concurrent.Future
import scala.concurrent.duration._
import play.api.libs.concurrent.Akka
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.{Application, Plugin}
import akka.actor.Cancellable
class AuthPlugin(app: Application) extends Plugin {
private var cancellableTokenDelete: Option[Cancellable] = None
...
override def onStart = {
cancellableTokenDelete = Some(
Akka.system.scheduler.schedule(0.seconds, 15.seconds) {
discardExpiredTokens
}
)
}
override def onStop = {
cancellableTokenDelete.foreach(_.cancel)
}
}
object AuthPlugin {
...
def discardExpiredTokens: Future[Unit] = {
tokenTraceService.removeExpired.recover {
case NonFatal(e) => Logger.error("error discarding expired tokens", e)
}.map { _ => }
}
}
即使15秒後discardExpiredTokens
不是招還沒有完成,它仍然被調度程序調用...但這不是我要找的。
也就是說,當前一個調用仍在執行時,如何防止調度程序調用discardExpiredTokens
?我需要一個機制,讓我繞過discardExpiredTokens
的電話,直到像Mutex這樣的東西沒有發佈。