我正在将一个现有的应用程序从Akka Classic移植到Akka Typed。
我知道在Akka Typed中不再支持此功能,我们应该使用Receptionist
来注册参与者,以便通过ServiceKey
进行发现。
但是,我只想将消息发送到 * 本地 * 执行元,即集群中每个节点上的本地单例。我有它的本地路径,但没有直接引用它。这是因为它是由Akka管理系统创建的运行状况检查执行元。
从文档中可以看出,使用Receptionist
注册ServiceKey的参与者可使其对群集的所有成员可用。因此,如果查询该ServiceKey
,我将收到对所有节点上的单一参与者的引用。
似乎没有一种方法可以只在本地注册Receptionist
,而且在集群中发布这些内部引用似乎是不必要的泄漏,并且违反了封装。从Receptionist
返回的Listing
中找出哪个引用是本地参与者似乎也不容易。我想用于注册的ServiceKey
可能是系统特定的?
我是否遗漏了一个明显的解决方案?
1条答案
按热度按时间ikfrs5lh1#
在Akka Management参与者的特定情况下,因为该项目不依赖于Akka Typed(因此所涉及的参与者是Classic参与者),您可以将Typed
ActorContext
视为ClassicActorContext
并使用ActorSelection
。从你的问题来看,我猜是Java(在Scala中,隐式语句使这一点不那么冗长,也许还能阐明意图):
对于只想解析一个Typed本地参与者的情况,我发现的最有效的策略是将解析功能合并到创建
ActorSystem
时提供的行为中。想被找到的参与者将向ActorSystem
注册,其他参与者可以向ActorSystem
请求ActorRef
。这里的一个微妙之处是
context.getSystem()
给了你一个ActorSystem<Void>
,它扩展了ActorRef<Void>
。请注意,为
ActorSystem
获取正确的消息类型非常重要:如果ActorSystem
的行为不接受这种类型的消息,那么当您发送消息时,actor系统将崩溃(据我所知,没有办法防止actor系统关闭)。此方法的一个改进是定义一个仅限本地的接收器参与者,它在
ActorSystem
启动时产生:希望与该接待员交互的参与者通过上述方法获得其X1M15N1X,然后该参与者处理解析。当然,请注意,在这两种方法中(就像集群感知的
Receptionist
一样),只有显式地选择这样被解析的参与者才是可解析的。让演员更多地负责向外界展示多少。