Akka 使用真实(非临时)发送方ActorRef在Actor启动时发送消息?

Akka 使用真实(非临时)发送方ActorRef在Actor启动时发送消息?,akka,Akka,我想让一个演员在启动时发送一条消息,然后再收到回复 从preStart中发送消息会导致一个临时sender引用(因为参与者还没有开始?)。因此,答案很可能是一纸空文 任何提示都将不胜感激。如果我的前提被错误告知,我表示歉意-我是Akka的新手。一种方法是在启动前向self发送消息: 类MyActor扩展了Actor{ def preStart():单位={ 自助电话服务 } def接收={ 案例呼叫服务=> (服务?服务请求)。映射到[ServiceResponse]。管道到(自身) 案例服务响

我想让一个演员在启动时发送一条消息,然后再收到回复

preStart
中发送消息会导致一个临时
sender
引用(因为参与者还没有开始?)。因此,答案很可能是一纸空文


任何提示都将不胜感激。如果我的前提被错误告知,我表示歉意-我是Akka的新手。

一种方法是在
启动前向
self
发送消息:

类MyActor扩展了Actor{
def preStart():单位={
自助电话服务
}
def接收={
案例呼叫服务=>
(服务?服务请求)。映射到[ServiceResponse]。管道到(自身)
案例服务响应=>
//对回应做点什么
}
}
如本节所述,如果您希望参与者在处理所有其他消息之前发送消息,则可以发送其他消息:

类MyActor使用Stash扩展Actor{
def preStart():单位={
自助电话服务
}
def未初始化:接收={
案例呼叫服务=>
(服务?服务请求)。映射到[ServiceResponse]。管道到(自身)
unstashAll()
context.been(已初始化)
case=>stash()//如果我们得到的是CallService以外的消息,请将其隐藏
}
def已初始化:接收={
案例服务响应=>
//对服务的响应做些什么
案例
}
def接收=未初始化
}

一种方法是在
启动前向
中的
self
发送消息:

类MyActor扩展了Actor{
def preStart():单位={
自助电话服务
}
def接收={
案例呼叫服务=>
(服务?服务请求)。映射到[ServiceResponse]。管道到(自身)
案例服务响应=>
//对回应做点什么
}
}
如本节所述,如果您希望参与者在处理所有其他消息之前发送消息,则可以发送其他消息:

类MyActor使用Stash扩展Actor{
def preStart():单位={
自助电话服务
}
def未初始化:接收={
案例呼叫服务=>
(服务?服务请求)。映射到[ServiceResponse]。管道到(自身)
unstashAll()
context.been(已初始化)
case=>stash()//如果我们得到的是CallService以外的消息,请将其隐藏
}
def已初始化:接收={
案例服务响应=>
//对服务的响应做些什么
案例
}
def接收=未初始化
}

你的前提确实是不正确的:当预启动运行时,参与者已经完全启动,它的
自我
引用从来都不是临时的。但是,如果没有代码,就不可能进一步帮助您。

您的前提确实是不正确的:当预启动运行时,参与者已经完全启动,它的
自我参考从来都不是临时的。但是,如果没有代码,就不可能进一步帮助您。

发送者应始终被视为“临时的”——参见本博客文章,例如:

在一个数据块中,规则永远不会关闭发送方方法 可能在另一个线程中执行的代码,例如 预定的任务或未来。诀窍是捕获当前发送者 在val中,如下图所示

--


制作一份发件人的副本,然后在准备回复时,回复该actorRef副本,而不是回复“发件人”。

发件人应始终被视为“临时”--参见本博客文章,例如:

在一个数据块中,规则永远不会关闭发送方方法 可能在另一个线程中执行的代码,例如 预定的任务或未来。诀窍是捕获当前发送者 在val中,如下图所示

--


制作一份发件人的副本,然后在您准备好回复时,回复actorRef的副本而不是“发件人”。

您可以向您的参与者发送初始消息,这将触发发送启动消息。或者,让你的演员有状态;它的启动状态将发送消息,然后它将转换到操作状态,在该状态下它将期望收到响应。感谢@BobDalgleish-这是否需要
been(receive)
调用
preStart
?您可以向您的参与者发送初始消息,这将触发发送启动消息。或者,让你的演员有状态;它的启动状态将发送消息,然后它将转换到操作状态,在那里它将期望收到响应。谢谢@BobDalgleish-这是否需要调用
been(receive)
preStart