我有一个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
的实例)确实做了它的东西和日志,所以我知道那部分正在工作。
发生了什么事?我的客串都错了吗?有更好的方法吗?我如何理解围绕此警告发生的事情>
答案 0 :(得分:1)
您的代码和日志输出是最新的吗? 首先,您将Read的定义定为
Read(Property(key ="MyConfigKey", value = None))
但是你正在使用它作为
Read(None, Property(key, None))
其次,您正在使用" PropertiesLookup _ $ {self.path.name}"创建演员。在名字中。但是你的日志输出显示这个演员名字并不包含" PropertiesLookup"字符串。
另外,请注意您记录的路径包含$a
,这表明匿名演员实际上在路径中,而actorSelection
中的内容并不存在。呼叫。