gpt4 book ai didi

java - 同步创建Akka Actor

转载 作者:行者123 更新时间:2023-11-30 02:14:32 25 4
gpt4 key购买 nike

我正在使用 ActorSystem.actorOf(property, bla) 创建一个 Actor。问题是,由于默认情况下 Akka 异步创建 actor,所以我遇到了竞争条件。

有没有办法在Akka中同步创建一个actor?

最佳答案

在最简单的用例中,您可以简单地采用这种模式:

  1. 在 Actor 的 preStart 中,初始化一个长时间运行的异步任务
  2. 完成后,您将向自己发送一条消息,其中包含长时间运行的任务的结果
  3. 处理此结果时,您可以初始化 actor 的状态。

您还需要一条订阅消息:当参与者收到检查其状态时,如果已初始化,则立即答复,如果没有将发送者附加到订阅者列表中。在处理初始化结果 (3) 时,您还通知所有订阅者。

trait ExpensiveThing
import MyActor._
class MyActor extends Actor {

var expensiveThing : ExpensiveThing = null
var initializationListeners:List[ActorRef] = List.empty


def initializeExpensiveThing() : Future[ExpensiveThing] = ???

override def preStart(): Unit = {
initializeExpensiveThing onSuccess {
case s => self ! InitializationDone(s)
}

}

override def receive: Receive = {
case InitializationDone(s) =>
expensiveThing = s
initializationListeners.foreach{ s => s ! Initialized }
case SubscribeInitialization =>
if(expensiveThing != null){
sender ! Initialized
}
else {
initializationListeners = sender() +: initializationListeners
}

}


}

object MyActor{
case class InitializationDone(s:ExpensiveThing)

case object SubscribeInitialization

case object Initialized


}
object MyProgram {
def doSomething(actorSystem:ActorSystem) = {
val actor = actorSystem.actorOf(Props(new MyActor))
import akka.pattern.ask
implicit val inizializationTimeout = new Timeout(100,TimeUnit.SECONDS)
Await.result(actor ? SubscribeInitialization,Duration.Inf)
}
}

注释:

  1. 我强烈建议您不要执行 Await.result,您应该简单地将 flatMap 放在使用询问模式时返回的 future 上
  2. 应该使用 context.become 或 Akka 提供的 FSM 抽象来处理更复杂的生命周期。

关于java - 同步创建Akka Actor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49012737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com