2014-12-24 4 views
1

У меня есть 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) делает свой материал и регистрируется, поэтому я знаю, что эта часть работает.

Что происходит? Моя ошибка? Есть ли лучшие способы сделать это? Как я понимаю, что происходит вокруг этого предупреждения>

ответ

1

Является ли ваш код и выходы журнала актуальными? Сначала вы дали определение читаться как

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

но вы используете его в качестве

Read(None, Property(key, None)) 

Во-вторых, вы создаете актер с «PropertiesLookup _ $ {self.path.name}» в названии. Но ваш вывод журнала показывает, что это имя актера не содержит строку «PropertiesLookup».

Кроме того, обратите внимание на то, что ваш путь в журнале содержит $a, который предполагает, что анонимный актер фактически находится на пути, который не является тем, что находится в вашем вызове actorSelection.

+0

Актер Lookup делает запись, да. Я думаю, что Lookup не упоминается в этом журнале, потому что он передает и передает отправитель, указанный в методе apply. Я даю ему уникальное имя, чтобы избежать столкновений. –

+0

Также, что разница чтения - это опечатка. Сообщение обновлено. –

+0

Я думаю, что может быть проблема с родителем-актером «Мастер». Я вижу из журнала 'akka: // NN/user/$ a/Master', что Мастер создан каким-то анонимным актером. В коде выбора вашего актера вы предполагаете, что Мастер создается актером 'user'. Таким образом, в основном путь просто неправильный. – Przemek

Смежные вопросы