4

在akka中假设有一个actor的线性链,每个actor从上游接收消息,向下游发送自己的消息并等待回复,然后向上游发送消息。当演员必须稍后回复该演员时,演员如何记住上游演员的句柄?

例如:

A sends message to B (b ! "msg1")
B sends message to C (c ! "msg2")
C replies to B (self.reply ! "msg3")
B replies to A <--- ???

基本上,B 怎么能记住 A 的句柄?此时执行 self.reply 将引用 C,因为 C 将当前消息发送给 B。

4

1 回答 1

6

演员B必须更改CA之间的回复消息吗?

  1. 如果不是,演员B应该使用B forward "msg"而不是B ! "msg". 这将保留发件人信息。当C使用回复时,不经过 B就自动将答案发送给A :

    A sends message to B (b ! "msg")

    B forward the message to C (c forward "msg")

    C replies to A (self.reply ! "msg3")

  2. 如果是,请获取发件人ActorRef并将其与消息发件人参考一起传递。

例如,使用一个简单的元组:

A sends message to B (b ! "msg1")
B sends message to C, with the sender reference (c ! ("msg2",self.sender) )
C replies to B adding the reference it received (self.reply ! ("msg3",ref) )
B replies to A ( ref ! "msg4" )

这里我使用了一个元组,但是如果你有一个更长的链,传递一个List[ActorRef]. 继续前进时,您会在发送者参考之前添加。当返回时,您回复列表头部并将列表尾部传递给回复。

编辑:考虑到维克多的评论。

于 2011-07-04T07:43:09.447 回答