首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Play Framework关机期间等待演员停止?

如何在Play Framework关机期间等待演员停止?
EN

Stack Overflow用户
提问于 2013-10-16 20:10:35
回答 1查看 3K关注 0票数 3

当我关闭播放服务器时,下面的代码会抛出一个java.lang.IllegalMonitorStateException异常;它是由onStop方法中的a.wait(1000)调用引起的。有人能告诉我为什么会出现这种情况,以及如何优雅地等待角色在Play框架关闭期间完成吗?

代码语言:javascript
复制
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()
    }
}

更新:

以下是完整的解决方案,如下所示:

代码语言:javascript
复制
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()
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-17 00:46:30

“如果需要等待终止或组合多个参与者的有序终止,优雅停止gracefulStop是有用的:

代码语言:javascript
复制
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
}

  • Stop

PS。谷歌搜索“优雅的演员阿克卡”给出的答案是最高的结果。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19412869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档