标题是不言自明的,我希望能够发送一个消息给一个父参与者(意思是我想要父的ActorRef
)。在Akka Classic(无类型)中,父参与者的ActorRef
可以通过以下方式从子参与者的ActorContext
中获得:
context.parent
(see例如,X1E0F1X)。
然而,Akka Typed中的akka.actor.typed.scaladsl.ActorContext
并没有为父角色公开一个ActorRef
。Scala中是否有一种惯用的方法来为父角色获取一个ActorRef
?
2条答案
按热度按时间wvyml7n51#
TLDR:在创建子角色时将父角色引用注入子角色。
Akka Typed强制执行严格的协议,因此您需要绝对清楚地表明“此参与者与另一个参与者对话”。公认的答案是一种解决方法(转换为经典并使用父对象),但也有其缺点:现在您不再强制类型。
下面是一些代码,你可以从这些代码入手,看看所有类型是如何被强制执行的。你可以用不同的方式来建模这些特性,但你应该明白其中的含义:
顺便说一句,我使用的是akka类型的“函数”语法,但你也可以使用更“面向对象”的语法,它遵循同样的方法。
bq9c1y662#
如果你在类型化的Akka中,唯一能包含
ActorRef
的[Scala]类型是ActorRef[Nothing]
,它是一个不能发送消息的ActorRef
,所以它的实用性有限。至少在经典API存在的时候是这样:
这将是一个非类型化的
ActorRef
,也就是说,您可以自由地发送父参与者永远不会接受的消息。如果你想要一个对参与者父代的类型化引用,你需要在派生子参与者时嵌入它,就像你想要一个对当前消息发送者的类型化引用,你需要在你的协议中嵌入
replyTo
。(
context.sender
在键入的ActorContext
中不存在,原因与context.parent
不存在的原因相同;用于复制经典X1 M8 N1 X的解决方法是类似的:(一个月九个月)