Akka消息未送达

时间:2014-12-24 21:21:50

标签: scala akka

我有一个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会在执行查找后将结果发送给它。在我做一些工作之前,我在另一个actor中使用所有这些来获取配置值:

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

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

  

消息[domain.Read]来自   演员[akka:// NN / user / $ a / Master / DataStore / PlayerStore#-1100303450]到   演员[akka:// NN / user / Master / DataStore / PropertiesStore]不是   交付。 [2]遇到死信。可以转换此日志记录   关闭或调整配置设置'akka.log-dead-letters'   和'akka.log-dead-letters-during-shutdown'

我从未在被叫方中收到我的Property实例。客串(PropertyLookup的实例)确实做了它的东西和日志,所以我知道那部分正在工作。

发生了什么事?我的客串都错了吗?有更好的方法吗?我如何理解围绕此警告发生的事情>

1 个答案:

答案 0 :(得分:1)

您的代码和日志输出是最新的吗? 首先,您将Read的定义定为

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

但是你正在使用它作为

Read(None, Property(key, None))

其次,您正在使用" PropertiesLookup _ $ {self.path.name}"创建演员。在名字中。但是你的日志输出显示这个演员名字并不包含" PropertiesLookup"字符串。

另外,请注意您记录的路径包含$a,这表明匿名演员实际上在路径中,而actorSelection中的内容并不存在。呼叫。