Scala 斯卡拉·阿克卡:演员还记得最终应该回复什么吗?

Scala 斯卡拉·阿克卡:演员还记得最终应该回复什么吗?,scala,actor,akka,Scala,Actor,Akka,在akka中,假设有一个线性的参与者链,每个参与者从上游接收一条消息,向下游发送自己的消息并等待回复,然后向上游发送一条消息。当必须稍后回复上游参与者时,参与者如何记住上游参与者的句柄 例如: 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 <--- ??? A向B发送消息(B!“msg1”) B向

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

例如:

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 <--- ???
A向B发送消息(B!“msg1”)
B向C发送消息(C!“msg2”)
C回复B(self.reply!“msg3”)
B对A的回复参与者B必须更改C和A之间的回复消息吗

  • 如果没有,参与者B应该使用
    B forward“msg”
    而不是
    B!“msg”
    。这将保留发件人信息。当C使用应答时,应答自动发送到A,而不经过B:

    A向B发送消息(B!“msg”)

    B将消息转发给C(C转发“msg”)

    C回复A(self.reply!“msg3”)

  • 如果是,则获取发件人
    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" )
    
    这里我使用了一个元组,但是如果您有一个较长的链,请传递一个
    列表[ActorRef]
    。继续操作时,请在发送者参考之前添加。当返回时,您回复列表头,并沿着回复传递列表尾


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

    仅供参考:无论B是否更改消息,转发都会起作用。感谢您的澄清。但是,如果B必须将回复更改为A,则警告仍然适用。