0

我正在尝试为集群分片配置 Akka Actor,我不太确定的一件事是,是否可以为实体配置多个停止消息以进行正常关闭。

例如,如下所示的实体配置将触发“onDelete”和“onExit”的正常关闭,或者它只会为“onExit”执行此操作?

sharding
   .init(
       Entity(Actor1Key) {
          context => ....
       }
   )
   .withStopMessage(Actor1.onDelete)
   .withStopMessage(Actor1.onExit)

如果没有,您是否知道我如何实现这种行为?

谢谢解答

4

2 回答 2

1

我认为围绕 的目的可能存在一些混淆stopMessage。不需要多个停止消息。

钝化后由分片stopMessage发送的角色已被参与者请求,这是通过Passivate从分片参与者本身发送来完成的。

您可以让actor接受的任何消息触发钝化,分片将stopMessage在actor实际停止安全时发回。

您应该钝化而不仅仅是参与者的原因Behaviors.stopped是,在消息导致它决定停止并且您想要先处理这些。shard钝化允许通过包含到负责将消息路由到分片参与者的参与者的往返来实现这一点。

此处文档中的更多详细信息:https ://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#passivation

于 2020-05-14T09:13:01.320 回答
0

您指定的内容只会触发Actor1.onExit. 原因是如何为实体定义停止消息:

val stopMessage: Optional[M],

所以你看到这是一个简单的可选,因此不可能有多个元素。您还可以在此处withStopMessage检查如何实现:

def withStopMessage(newStopMessage: M): Entity[M, E] =
    copy(stopMessage = Optional.ofNullable(newStopMessage))

所以你基本上会在你打电话的任何时候“覆盖”这条消息withStopMessage。不幸的是,我不知道指定多个停止消息的任何其他方式(除了将多个消息组合成一个共同特征,但我认为这不是您要寻找的)。

于 2020-05-11T20:29:33.313 回答