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

scala – 按需演员获取或创建

发布时间:2020-12-16 09:42:40 所属栏目:安全 来源:网络整理
导读:我可以用actorOf创建演员,并用actorFor来查看。我现在想通过一些id获得一个actor:String,如果它不存在,我希望它被创建。这样的事情 def getRCActor(id: String):ActorRef = { Logger.info("getting actor %s".format(id)) var a = system.actorFor(id) i
我可以用actorOf创建演员,并用actorFor来查看。我现在想通过一些id获得一个actor:String,如果它不存在,我希望它被创建。这样的事情

def getRCActor(id: String):ActorRef = {
    Logger.info("getting actor %s".format(id))
    var a = system.actorFor(id)
    if(a.isTerminated){
      Logger.info("actor is terminated,creating new one")
      return system.actorOf(Props[RC],id:String)
    }else{
      return a
    }
   }

但是这不起作用,因为终止始终是真实的,我得到演员姓名1并不是唯一的!第二次呼叫例外。我想我在这里使用错误的模式。有人可以帮助如何实现这一点吗?我需要

>按需创建演员
>通过id查找演员,如果不存在则创建它们
>能摧毁,因为我不知道我是否会再需要它

我应该使用调度程序或路由器吗?


根据建议,我使用一个具体的主管,在地图中保存可用的演员。可以要求他提供一个孩子。

class RCSupervisor extends Actor {

  implicit val timeout = Timeout(1 second)
  var as = Map.empty[String,ActorRef]

  def getRCActor(id: String) = as get id getOrElse {
    val c = context actorOf Props[RC]
    as += id -> c
    context watch c
    Logger.info("created actor")
    c
  }

  def receive = {

    case Find(id) => {
      sender ! getRCActor(id)
    }

    case Terminated(ref) => {
      Logger.info("actor terminated")
      as = as filterNot { case (_,v) => v == ref }
    }
  }
}

他的伴侣对象

object RCSupervisor {

  // this is specific to Playframework (Play's default actor system)
  var supervisor = Akka.system.actorOf(Props[RCSupervisor])

  implicit val timeout = Timeout(1 second)

  def findA(id: String): ActorRef = {
    val f = (supervisor ? Find(id))
    Await.result(f,timeout.duration).asInstanceOf[ActorRef]
  }
  ...
}

解决方法

我没有一直在使用akka,但是演员的创作者默认是他们的主管。因此,父母可以听取他们的终止;

var as = Map.empty[String,ActorRef] 
def getRCActor(id: String) = as get id getOrElse {
  val c = context actorOf Props[RC]
  as += id -> c
  context watch c
  c
}

但显然你需要注意终止;

def receive = {
  case Terminated(ref) => as = as filterNot { case (_,v) => v == ref }

这是一个解决方案吗?我必须说我完全不明白你的意思是“终止始终是真的=>演员姓名1不是唯一的!

(编辑:李大同)

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

    推荐文章
      热点阅读