是否可以在Akka集群中定义多个停止消息

55ooxyrt  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(156)

我正在尝试为集群分片配置Akka Actor,有一点我不太确定,是否可以为一个实体配置几个停止消息以进行正常关闭。
例如,如下所示的实体配置将触发“onDelete”和“onExit”的正常关闭,还是仅触发“onExit”的正常关闭?

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

如果没有,你知道我怎样才能达到这种行为吗?
感谢您的解答

k7fdbhmy

k7fdbhmy1#

我认为关于stopMessage的用途可能会有一些混乱。不应该有多个停止消息的需要。
参与者请求了在钝化之后分片发送的stopMessage,这是通过从分片的参与者本身发送Passivate来完成的。
您可以让参与者接受的任何消息触发钝化,当参与者可以安全地实际停止时,shard将发回stopMessage
您应该钝化而不仅仅是Behaviors.stopped执行元的原因是,可能有消息正在发送到执行元(邮箱,我认为在某些情况下可能是碎片中的缓冲区),然后消息导致它决定停止,您希望首先处理这些。钝化允许通过包括到shard参与者的往返来实现这一点,shard参与者负责将消息路由到分片参与者。
更多详情请参见此处的文档:https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#passivation

h22fl7wq

h22fl7wq2#

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

val stopMessage: Optional[M],

所以你可以看到这是一个普通的可选元素,因此不可能有多个元素。你也可以在这里检查withStopMessage是如何实现的:

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

因此,每次调用withStopMessage时,基本上都会“覆盖”消息。不幸的是,我不知道有任何其他方法可以指定多个停止消息(除了将多个消息组合在一个共同的特性中,但我认为这不是您要找的)。

相关问题