【问题标题】:scala akka: have actor remember something it should eventually reply to?scala akka:演员是否记得它最终应该回复的内容?
【发布时间】:2011-09-27 21:04:30
【问题描述】:

在akka中假设有一个线性的actor链,每个actor从上游接收消息,向下游发送自己的消息并等待回复,然后向上游发送消息。当稍后必须回复上游actor时,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。

【问题讨论】:

    标签: scala actor akka


    【解决方案1】:

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

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

      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]。继续前进时,您会在发送者参考之前添加。当返回时,您回复列表头部并将列表尾部沿着回复传递。

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

    【讨论】:

    • 仅供参考:无论 B 是否更改消息,转发都会起作用。
    • 感谢您的澄清。但是,如果 B 必须更改对 A 的回复,则该警告仍然适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2019-04-23
    • 2016-11-09
    • 2014-06-13
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多