Scala Akka-如何知道消息是告诉还是询问?

Scala Akka-如何知道消息是告诉还是询问?,scala,akka,actor,Scala,Akka,Actor,有没有办法确定一条消息是告诉还是询问 用例: 我看到过这样的例子,一个库是从一个演员的外部使用的,而告诉是用于消息的。因为库会回复成功/失败的结果,但在使用中我并不关心它,所以我们使用tell并将消息接收回非参与者的上下文。默认情况下,消息转到死信,这很好,但它会记录消息。您可以调整日志记录以关闭消息,但我想知道是否有任何方法可以确定消息是来自库内部的告诉还是询问,而无需执行诸如为fire and forget vs asks指定特定消息类型之类的操作。我的消息类型中始终包含“reply to”

有没有办法确定一条消息是告诉还是询问

用例:

我看到过这样的例子,一个库是从一个演员的外部使用的,而告诉是用于消息的。因为库会回复成功/失败的结果,但在使用中我并不关心它,所以我们使用tell并将消息接收回非参与者的上下文。默认情况下,消息转到死信,这很好,但它会记录消息。您可以调整日志记录以关闭消息,但我想知道是否有任何方法可以确定消息是来自库内部的告诉还是询问,而无需执行诸如为fire and forget vs asks指定特定消息类型之类的操作。

我的消息类型中始终包含“reply to”字段。有时我会将其设置为一个
选项[ActorRef]
,但通常我会使用一个重复的参数(它概括了响应传输并使所有情况更清晰–无
/
一些(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")
    ...
  }
  ...
}

无法测试atm,但请考虑
ActorRef.noSender().equals(sender())
?您可以尝试查看发件人的路径。我认为由ask模式创建的临时参与者以/system开头,而由您包装的常规参与者将以/user开头。我真的不建议使用它,因为我认为这两种方式都不重要,但如果你真的需要它,它可能会起作用。是的,我考虑过解析参与者路径。你是对的,临时参与者(如在ask中)在临时路径中注册。但是似乎很难与Akka的具体细节结合起来。这似乎很奇怪-你可以根据需要使用sender、forward或pipeTo来确保消息在单个参与者响应时返回到正确的消息。对于多个侦听器,我认为最好注册一个侦听器并将其保持在actor中的状态,而不是在每条消息中发送一个actor列表。很明显,这只是一个观点-+1对于解决问题的解决方案。我在AKKA中寻找一些东西。如果消息流的拓扑结构是静态确定的,那是可以工作的,但是我经常发现通过使路由动态变得有用来获得灵活性。这是一个有趣的想法,再次感谢。我注意到,使用tell方法,还可以隐式地指定对ActorRef的回复。我更愿意在可能的情况下使用akkaapi来满足这些需求。