[英]How to send an Akka actor shutdown message from controller in play framework
[英]How do I wait for an actor to stop during Play Framework shutdown?
當我關閉播放服務器時,下面的代碼拋出java.lang.IllegalMonitorStateException異常; 它是由onStop方法中的a.wait(1000)調用引起的。 誰能告訴我為什么會這樣,以及如何優雅地等待一個演員在Play框架關閉中完成?
import play.api.GlobalSettings
import play.api.libs.concurrent.Akka
import akka.actor.{ Actor, Props }
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.Play.current
import models.{ TestActor, StartMessage, StopMessage }
object Global extends GlobalSettings {
override def onStart(application : play.api.Application) {
val a = Akka.system.actorOf(Props[TestActor], name = "test-actor")
a ! StartMessage("Start instruction")
}
override def onStop(application : play.api.Application) {
val a = Akka.system.actorSelection("akka://application/user/test-actor")
a ! StopMessage("Stop instruction")
a.wait(1000)
Akka.system.shutdown()
}
}
更新:
這是完整的解決方案,采用以下答案:
import play.api.GlobalSettings
import play.api.libs.concurrent.Akka
import akka.actor.{ Actor, Props }
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.Play.current
import models.{ TestActor, StartMessage, StopMessage }
import akka.pattern.gracefulStop
import scala.concurrent.Future
import scala.concurrent.duration.FiniteDuration
import scala.concurrent.Await
import com.typesafe.config.impl.ResolveContext
import com.typesafe.config.impl.ResolveContext
import akka.actor.ActorIdentity
object Global extends GlobalSettings {
override def onStart(application : play.api.Application) {
val a = Akka.system.actorOf(Props[TestActor], name = "test-actor")
a ! StartMessage("Start Instruction")
}
override def onStop(application : play.api.Application) {
val a = Akka.system.actorFor("akka://application/user/test-actor")
a ! StopMessage("Stop Instruction")
try {
val stopped : Future[Boolean] = gracefulStop(a, scala.concurrent.duration.Duration(5, "seconds"))
Await.result(stopped, scala.concurrent.duration.Duration(6, "seconds"))
// the actor has been stopped
}
catch {
case e : akka.pattern.AskTimeoutException => // the actor wasn't stopped within 5 seconds
}
Akka.system.shutdown()
Akka.system.awaitTermination()
}
}
“優雅停止gracefulStop非常有用,如果你需要等待終止或組成幾個演員的有序終止:
import akka.pattern.gracefulStop
import akka.dispatch.Await
import akka.actor.ActorTimeoutException
try {
val stopped: Future[Boolean] = gracefulStop(actorRef, 5 seconds)(system)
Await.result(stopped, 6 seconds)
// the actor has been stopped
} catch {
case e: ActorTimeoutException ⇒ // the actor wasn't stopped within 5 seconds
}
“
PS。 谷歌搜索“優雅演員akka”給出了答案作為最佳結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.