0

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

val actor2sel = context.actorSelection(RootActorPath(m.address) / "user" / "actor2")

wherem是集群的成员。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

您对可能的原因有任何指示吗?

4

1 回答 1

1

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

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

actor3

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

senderactor1鉴于上述消息链,上面是对 的引用。

如果只涉及两个参与者,则转发不是正确的工具:

actor1 --[forwards Message1]--> actor2

actor2中,如果它被转发一个Message1from actor1,而消息链中没有“前一个”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 的消息,请确保在 Actor2 访问之前这个“前一个”actor 正在运行sender

于 2017-10-16T14:24:57.460 回答