Akka Cluster - 来自死信的消息?

Akka Cluster - message coming from dead letters?

我正在使用 Akka Cluster,但遇到了一个有趣的问题。我在节点 A (akka.tcp://as@127.0.0.1:2554) 上有一个演员 Actor1。这个演员使用

在另一个节点上找到另一个演员
val actor2sel = context.actorSelection(RootActorPath(m.address) / "user" / "actor2")

其中 m 是集群的成员。 actor2sel 是

ActorSelection[Anchor(akka.tcp://as@127.0.0.1:2553/), Path(/user/actor2)]

稍后,Actor1转发消息给Actor2,Actor2正确获取消息,但发送者为deadLetters:

akka.tcp://as@127.0.0.1:2554/deadLetters

您是否知道可能是什么原因?

仅当消息链中至少有三个参与者时转发消息才有意义:

actor1 --[sends Messsage1]--> actor2 --[forwards Message1]--> actor3

actor3中:

def receive = {
  case Message1 =>
    sender ! Response1
}

sender 以上是对 actor1 的引用,给定上述消息链。

如果只有两个演员参与,转发不是正确的工具:

actor1 --[forwards Message1]--> actor2

actor2中,如果从actor1转发了一个Message1,消息链中没有"previous"actor,那么发送者就是死信:

def receive = {
  case Message1 =>
    sender ! Response1
    // sender is dead letters if there are only two actors in the forwarding chain 
}

如果 Actor1 在将消息转发给 Actor2 之前没有收到来自另一个 actor 的消息,只需让 Actor1 将消息发送 (!) 给 Actor2 而不是转发它。

如果 Actor1 在转发之前确实收到了来自另一个 actor 的消息,请确保此 "previous" actor 在 Actor2 访问 sender.

之前是 运行