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
.
之前是 运行
我正在使用 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
.