scala – 如何在Play Framework关闭期间等待演员停止?
发布时间:2020-12-16 09:06:23 所属栏目:安全 来源:网络整理
导读:当我关闭播放服务器时,下面的代码抛出 java.lang.IllegalMonitorStateException异常;它是由onStop方法中的a.wait(1000)调用引起的.谁能告诉我为什么会这样,以及如何优雅地等待一个演员在Play框架关闭中完成? import play.api.GlobalSettingsimport play.api
当我关闭播放服务器时,下面的代码抛出
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,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() } } 解决方法
“优雅的停止
如果您需要等待终止或组合多个actor的有序终止,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 } “ > http://doc.akka.io/docs/akka/2.0/scala/actors.html#Graceful_Stop PS.谷歌搜索“优雅演员akka”给出了答案作为最佳结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |