akka ActorIdentity.getRef()在akka网站示例中返回null



我正在尝试运行教程中提到的示例:

我下载了选项2中提到的模板包,并用它配置了一个eclipse项目。

在eclipse中输入"Run the Lookup Example"(来自上面提到的教程)时,根据教程,我应该得到如下输出:

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 
反复


函数 onReceive 中导致 LookupActor.java 输出的相关行是:

 calculator = ((ActorIdentity) message).getRef();
 if (calculator == null) {
 System.out.println("Remote actor not available: " + path);

(路径LookupApplication类中初始化为akka.tcp://CalculatorSystem@127.0.0.1:2552/user/calculator,并传递给LookupActor。

所以基本上,calculator = ((ActorIdentity) message).getRef(); 总是返回null ,这就是导致此输出的原因。

到目前为止我所做的:

我试图改变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());  

,我从这里提到的理解。

但是它没有帮助,它总是返回null。我认为这是一个问题,因为教程说输出应该是不同的。

感谢您的帮助


编辑:
我在LookupActor类中编辑了"onRecieve"方法,如下所示:

  @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");
//
//          }
}

创建了一个enum:

private enum msg{
  GREET;
}

和更新的方法" sendIdentifyRequest ",而不是:

getContext().actorSelection(path).tell(new Identify(path), getSelf());

现在

getContext().actorSelection(path).tell(msg.GREET, getSelf());

它现在正在工作,但我不认为这是正确的解决方案,它只是一个避免真正问题的权宜之计。


由于路径问题,ConfigFactory无法加载配置,如:remotellookup .conf, calculator.conf等。当配置加载失败时,ConfigFactory返回使用默认配置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中的configs文件移动到akka可以访问的路径下。

如果你正在使用Netbean/其他IDE并且没有正确配置路径,请将其放置在target/classes/或target/或bin/或他们放置编译类的地方。

相关内容

  • 没有找到相关文章

最新更新