2015-08-15 27 views
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這樣的東西沒有發佈。

回答

相關問題