【问题标题】:Akka - how to know if a message is a tell or an ask?Akka - 如何知道消息是告诉还是询问?
【发布时间】:2014-04-04 18:54:08
【问题描述】:

有什么方法可以确定消息是告诉还是询问?

用例:

我看到了从演员外部使用库并告诉用于消息的情况。因为库会回复成功/失败的结果,但我在使用中并不关心它,我们正在使用 tell 并将消息接收回一个不是演员的上下文。默认情况下,消息会发送到 deadLetters,这很好,但它会记录消息。您可以调整日志记录以关闭消息,但我想知道是否有任何方法可以确定消息是来自库内部的告知还是询问,而无需执行诸如具有特定消息类型的火灾和忘记与询问之类的操作.

【问题讨论】:

  • 不能测试 atm 但是,想想ActorRef.noSender().equals(sender()) ?
  • 您可以尝试查看发件人的路径。我认为由 ask 模式创建的临时参与者以 /system 开头,而由您创建的常规参与者将以 /user 开头。我真的不建议使用它,因为我认为这两种方式都不重要,但如果你真的需要它可能会起作用。
  • 是的,我考虑过解析演员路径你是正确的,临时演员(例如询问)在临时路径中注册。不过,似乎很难与 Akka 的具体细节结合起来。

标签: scala akka actor


【解决方案1】:

我总是在我的消息类型中包含一个“回复”字段。有时我将其设为Option[ActorRef],但通常我使用重复参数(它概括了响应传输并使所有情况更清晰——没有None / Some(replyTo) / List(replyOne, replyTwo ...) 等)重复参数方法由一个隐式类提供便利,该类通过提供!* 方法允许扇出。

所以,是这样的:

case class Req(i: Int, s: String, replyTo: ActorRef*)
case class Resp(mesg: String)

class MyActor extends Actor {
  ...
  def receive = {
    case Req(i, s, replyTo) => ... replyTo !* Resp("Consider it handled")
    ...
  }
  ...
}

【讨论】:

  • 这看起来很奇怪 - 您可以根据需要使用 sender、forward 或 pipeTo 来确保消息在需要响应的单个参与者时返回到正确的消息。对于多个侦听器,我认为注册一个侦听器并将其保持在actor中的状态会更好,而不是在每条消息中发送一个actor列表。显然只是一种意见-+1 表示仍然可以解决该问题的解决方案。我一直在寻找 akka 原生的东西。
  • 如果消息流的拓扑结构是非常静态确定的,那可以工作,但我经常发现通过使路由动态化所获得的灵活性很有用。
  • 这是一个值得考虑的有趣想法 - 再次感谢。我注意到使用 tell 方法,您还可以隐式指定对 ActorRef 的回复。我更愿意尽可能使用 akka API 来满足这些需求。
猜你喜欢
  • 2016-03-29
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多