加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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”给出了答案作为最佳结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读