gpt4 book ai didi

scala - 在能够处理其他一些消息之前初始化一个actor

转载 作者:行者123 更新时间:2023-12-04 10:07:37 24 4
gpt4 key购买 nike

我有一个 Actor ,它创造了另一个 Actor :

class MyActor1 extends Actor {
val a2 = system actorOf Props(new MyActor(123))
}

第二个actor在创建后必须初始化(引导)自己,只有在此之后它才能做其他工作。
class MyActor2(a: Int) extends Actor {
//initialized (bootstrapped) itself, potentially a long operation
//how?
val initValue = // get from a server

//handle incoming messages
def receive = {
case "job1" => // do some job but after it's initialized (bootstrapped) itself
}
}

所以第一件事 MyActor2必须做的是做一些初始化自己的工作。这可能需要一些时间,因为它是对服务器的请求。只有在它成功完成后,它才能通过 receive 处理传入的消息。 .在此之前 - 它不能那样做。

当然,对服务器的请求必须是异步的(最好使用 Future ,而不是 asyncawait 或其他高级内容,如 AsyncHttpClient )。我知道如何使用 Future,不过这不是问题。

我如何确保?

附言我的猜测是它必须先向自己发送一条消息。

最佳答案

您可以使用 become初始化后改变actor行为的方法:

class MyActor2(a: Int) extends Actor {

server ! GetInitializationData

def initialize(d: InitializationData) = ???

//handle incoming messages
val initialized: Receive = {
case "job1" => // do some job but after it's initialized (bootstrapped) itself
}

def receive = {
case d @ InitializationData =>
initialize(d)
context become initialized
}
}

请注意,此类参与者将在初始化之前删除所有消息。您必须手动保存这些消息,例如使用 Stash :
class MyActor2(a: Int) extends Actor with Stash {

...

def receive = {
case d @ InitializationData =>
initialize(d)
unstashAll()
context become initialized
case _ => stash()
}
}

如果您不想使用 var对于初始化,您可以使用 InitializationData 创建初始化行为像这样:
class MyActor2(a: Int) extends Actor {

server ! GetInitializationData

//handle incoming messages
def initialized(intValue: Int, strValue: String): Receive = {
case "job1" => // use `intValue` and `strValue` here
}

def receive = {
case InitializationData(intValue, strValue) =>
context become initialized(intValue, strValue)
}
}

关于scala - 在能够处理其他一些消息之前初始化一个actor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20591124/

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