У меня есть PropertiesStore
актер, содержащий mutable.Buffer
конфигурации времени выполнения, который управляется через API для отдыха. Вы читать и писать из указанного магазина с помощью этих объектов:Akka сообщение не доставлено
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
имеет необязательный целевой объект, который PropertiesStore
отправит результат, как только будет выполнен поиск. Я использую все это как так в другой актер, чтобы получить значение конфигурации, прежде чем я сделать некоторую работу:
context.actorOf(PropertyLookup(PropertyKeys.SpreadsheetURL, None), s"PropertiesLookup_${self.path.name}") ! None
, но когда я делаю это, я получаю следующее предупреждение:
Сообщение [domain.Read ] from Актер [akka: // NN/user/$ a/Master/DataStore/PlayerStore # -1100303450] до Актер [akka: // NN/user/Master/DataStore/PropertiesStore] не был отправлен . [2] Найдены мертвые буквы. Эта регистрация может быть включена выключена или регулируется в меню Конфигурации «akka.log мертвой буква» и «akka.log мертвой буквы-во-выключение»
, и я никогда не получу свой экземпляр недвижимости в вызываемого. Казус (экземпляр PropertyLookup
) делает свой материал и регистрируется, поэтому я знаю, что эта часть работает.
Что происходит? Моя ошибка? Есть ли лучшие способы сделать это? Как я понимаю, что происходит вокруг этого предупреждения>
Актер Lookup делает запись, да. Я думаю, что Lookup не упоминается в этом журнале, потому что он передает и передает отправитель, указанный в методе apply. Я даю ему уникальное имя, чтобы избежать столкновений. –
Также, что разница чтения - это опечатка. Сообщение обновлено. –
Я думаю, что может быть проблема с родителем-актером «Мастер». Я вижу из журнала 'akka: // NN/user/$ a/Master', что Мастер создан каким-то анонимным актером. В коде выбора вашего актера вы предполагаете, что Мастер создается актером 'user'. Таким образом, в основном путь просто неправильный. – Przemek