【发布时间】: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 的实例)确实完成了它的工作并记录了,所以我知道那部分正在工作。
发生了什么事?我的客串全错了吗?有没有更好的方法来做到这一点?我如何理解围绕此警告发生的情况>
【问题讨论】: