akka ActorIdentity.getRef() возвращает ноль в примере веб-сайта akka
Я пытаюсь запустить пример, как указано в руководстве здесь:
Я скачал пакет шаблонов, как указано в варианте 2, и настроил с ним проект eclipse.
Когда я " Run the Lookup Example
"(из учебника, упомянутого выше) в Eclipse, в соответствии с учебником, я должен получить вывод, такой как:
Started LookupSystem
Calculating 74 - 42
Sub result: 74 - 42 = 32
Calculating 15 + 71
Add result: 15 + 71 = 86
Но на самом деле я получаю следующие строки:
Remote actor not available: akka.tcp://CalculatorSystem@127.0.0.1:2552/user/calculator
Not ready yet
Not ready yet
Not ready yet
Несколько раз.
Соответствующие строки, которые вызывают этот вывод из LookupActor.java
в функции onReceive
это те:
calculator = ((ActorIdentity) message).getRef();
if (calculator == null) {
System.out.println("Remote actor not available: " + path);
(путь инициализирован до akka.tcp://CalculatorSystem@127.0.0.1:2552/user/calculator
в LookupApplication
класс и передается LookupActor.
В общем, calculator = ((ActorIdentity) message).getRef();
всегда возвращает ноль, и это то, что вызывает этот вывод.
Что я пытался сделать до сих пор:
Я пытался изменить переменную пути в классе LookupApplication
от:
akka.tcp://CalculatorSystem@127.0.0.1:2552/user/calculator
в
akka.tcp://CalculatorSystem@127.0.0.1:2552/user/CalculatorActor
и строка:
system.actorOf(Props.create(CalculatorActor.class),calculator);
чтобы:
system.actorOf(Props.create(CalculatorActor.class), CalculatorActor.class.getSimpleName());
как я понял из упомянутого здесь.
Но это не помогло, оно всегда возвращает ноль. Я предполагаю, что это проблема, так как учебник говорит, что вывод должен быть другим.
Буду признателен за любую помощь
РЕДАКТИРОВАТЬ:
Я отредактировал onRecieve
"метод в LookupActor
класс как это:
@Override
public void onReceive(Object message) throws Exception {
// if (message instanceof ActorIdentity) {
// calculator = ((ActorIdentity) message).getRef();
if (message == null) {
System.out.println("Remote actor not available: " + path);
} else {
getContext().watch(calculator);
getContext().become(active, true);
}
// } else if (message instanceof ReceiveTimeout) {
// sendIdentifyRequest();
//
// } else {
// System.out.println("Not ready yet");
//
// }
}
и создал перечисление:
private enum msg{
GREET;
}
и обновленный метод " sendIdentifyRequest
", вместо:
getContext().actorSelection(path).tell(new Identify(path), getSelf());
Сейчас
getContext().actorSelection(path).tell(msg.GREET, getSelf());
Это работает сейчас, но я не думаю, что это правильное решение, это просто обходной путь, который позволяет избежать реальной проблемы.
1 ответ
Из-за проблем с путями ConfigFactory не может загрузить такие конфигурации, как: remotelookup.conf, calculator.conf и так далее. Поскольку загрузка конфигурации не удалась, ConfigFactory вернулась к использованию Config по умолчанию, который является akka.actor.LocalActorRefProvider вместо akka.remote.RemoteActorRefProvider.
эта строка не будет работать:
public static void startRemoteWorkerSystem() {
ActorSystem.create("CalculatorWorkerSystem",
ConfigFactory.load(("calculator")));
System.out.println("Started CalculatorWorkerSystem");
}
ConfigFactory.load (("калькулятор")));
Переместите этот файл настроек в src/main/resources на путь, доступный для akka.
Если вы используете Netbean / другую IDE и не настроили путь правильно, поместите его в target / classes / или target / или bin/ или в место, где они поместили свой скомпилированный класс.