【问题标题】:Akka message undeliveredAkka 消息未送达
【发布时间】:2015-02-22 21:19:30
【问题描述】:

我有一个 PropertiesStore actor,它拥有一个 mutable.Buffer 的运行时配置,该配置通过一个 rest API 进行操作。您使用这些对象从所述存储中读取和写入:

Read(None, Property(key ="MyConfigKey", value = None))

商店用Property 及其值对其进行响应。

为了便于定位这家商店,我有另一个演员(客串)是我在运行中创建的:

object PropertyLookup {
  def apply(propertyKey: String, target: Option[ActorRef]): Props = {
    Props(new PropertyLookup(propertyKey, target))
  }
}

class PropertyLookup(key: String, target: Option[ActorRef]) extends Actor with ActorLogging {
  val PropertiesStore = "/user/Master/DataStore/PropertiesStore"
  val propertiesActor = context.actorSelection(PropertiesStore)

  def receive: Actor.Receive = {
    case _=>
      log.info(s"Looking up ${key} via ${propertiesActor}")
      propertiesActor.tell(Read(None, Property(key, None)), target.getOrElse(sender()))
      log.info(s"Sent property lookup to PropertiesStore: ${key}")
//      context.stop(self)
  }
}

这使我能够将所述演员的“定位”(即通过其路径)保持在一个地方,避免在移动时进行过多的返工。这个PropertyLookup 有一个可选的目标actor,一旦执行了查找,PropertiesStore 就会将结果发送给它。在我做一些工作之前,我在另一个演员中使用所有这些来获取配置值:

  context.actorOf(PropertyLookup(PropertyKeys.SpreadsheetURL, None), s"PropertiesLookup_${self.path.name}") ! None

但是当我这样做时,我会收到以下警告:

消息 [domain.Read] 来自 Actor[akka://NN/user/$a/Master/DataStore/PlayerStore#-1100303450] 到 Actor[akka://NN/user/Master/DataStore/PropertiesStore] 不是 发表。 [2] 遇到死信。这个日志记录可以转 关闭或使用配置设置“akka.log-dead-letters”进行调整 和'akka.log-dead-letters-during-shutdown'

我从未在被调用者中收到我的 Property 实例。客串(PropertyLookup 的实例)确实完成了它的工作并记录了,所以我知道那部分正在工作。

发生了什么事?我的客串全错了吗?有没有更好的方法来做到这一点?我如何理解围绕此警告发生的情况>

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    您的代码和日志输出是最新的吗? 首先你给出了 Read as 的定义

    Read(Property(key ="MyConfigKey", value = None))
    

    但是你将它用作

    Read(None, Property(key, None))
    

    其次,您要创建名称为“PropertiesLookup_${self.path.name}”的演员。但是您的日志输出显示此参与者名称不包含“PropertiesLookup”字符串。

    此外,请注意,您记录的路径包含一个 $a,这表明路径中实际上是一个匿名参与者,这不是您的 actorSelection 调用中的内容。

    【讨论】:

    • 查找actor确实记录了,是的。我认为该日志中没有提到 Lookup,因为它会告诉并传递它在 apply 方法中给出的发件人。我给它一个唯一的名字以避免冲突。
    • 我认为,“大师”演员父母也可能存在问题。我从日志akka://NN/user/$a/Master 中看到,Master 是由某个匿名演员创建的。在您假设的演员选择代码中,Master 是由user actor 创建的。所以基本上路径是错误的。
    • 啊,是的。我看到了,但不确定,什么也没想到。大概actorSelection 返回路径为“默认/死信”的演员,因此为什么不交付。谢谢,圣诞快乐!
    • 这有帮助!现在没有$a,因为我将创建主actor的部分移动到使用context.system,从而解决了问题。使用此信息更新您的帖子,我会接受它作为答案。再次感谢!
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2012-10-09
    • 2023-03-17
    • 2014-12-03
    • 2016-09-23
    相关资源
    最近更新 更多