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/ или в место, где они поместили свой скомпилированный класс.

Другие вопросы по тегам