【问题标题】:how to use synchronization in scala如何在scala中使用同步
【发布时间】:2018-09-08 14:13:11
【问题描述】:

我正在创建一个演员,我想第一次创建它,然后在需要该演员时使用它的演员引用。这是代码

val actorPath = "akka://testActorSystem/user/'"
object ActorManager {  
def getTestActorRef: ActorRef = {
    var actorRef: Option[ActorRef] = None
    this.synchronized {
    val sel = system.actorSelection(actorPath + "testActor");
    val future1 = sel.resolveOne()
    val res: Try[ActorRef] = Await.ready(future1, timeout.duration).value.get
    res match {
      case Success(actorref) =>
        actorRef = Some(actorref)
        actorRef.get
      case Failure(e) =>
        val testActor = system.actorOf(Props[TestActor], name = "testActor")
        actorRef = Some(testActor)
    }
    getActorRef(actorRef.get)
    }
    actorRef.get
  }
}

Q1->这是实现我想要的功能的正确方法吗? 我遇到的问题是,无论何时在两个地方同时调用此代码。

ActorManager.getTestActorRef

它抛出两个不同的异常:

akka.actor.ActorNotFound: Actor not found for: ActorSelection[Anchor(akka://testActorSystem/), Path(/user/'testActor)]
        at akka.actor.ActorSelection$$anonfun$resolveOne$1.apply(ActorSelection.scala:65) ~[akka-actor_2.11-2.3.6.jar:na]
        at akka.actor.ActorSelection$$anonfun$resolveOne$1.apply(ActorSelection.scala:63) ~[akka-actor_2.11-2.3.6.jar:na]

和:

akka.actor.InvalidActorNameException: actor name [testActor] is not unique!
        at akka.actor.dungeon.ChildrenContainer$NormalChildrenContainer.reserve(ChildrenContainer.scala:130) ~[akka-actor_2.11-2.3.6.jar:na]
        at akka.actor.dungeon.Children$class.reserveChild(Children.scala:77) ~[akka-actor_2.11-2.3.6.jar:na]
        at akka.actor.ActorCell.reserveChild(ActorCell.scala:369) ~[akka-actor_2.11-2.3.6.jar:na]

我尝试使用this.synchronized,但没有帮助,当我多次调用此方法时出现问题

ActorManager.getTestActorRef

如何创建一次actor并一次又一次地使用它的actorRef而不再次创建它?

【问题讨论】:

    标签: scala akka akka-actor


    【解决方案1】:

    要实现您的目标,您只需要:

    object ActorManager {
      val getTestActorRef: ActorRef = system.actorOf(Props[TestActor], name = "testActor")
    }
    

    这将创建一次actor并且它是可用的。你不需要actorSelection、同步等所有这些东西。

    因此,您将获得对 ActorRef 的静态引用,您可以使用它来发送消息。此引用的 Actor 将在后台创建一次。

    【讨论】:

    • 下次如果我想像 ActorManager.getTestActorRef 一样访问这个演员,这不是演员不是唯一的例外吗?
    • 没有。在object 里面是val 而不是def
    • 谢谢它的帮助,但我遇到了另一个问题,你能不能也看看它stackoverflow.com/questions/49574551/…
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多