akka遥控器无法找到

时间:2017-10-03 14:06:01

标签: java akka

我正在学习Akka远程教学,指的是 Learning Akka 这本书。

使用有限的网络,我无法使用sbt(无法很好地配置代理)。

首先,我使用application.conf

为Akka服务器创建一个项目
akka {
  actor {
    provider = remote
  }
  remote {
    emabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
  }
}

,控制台显示

Remoting now listens on addresses: [akka.tcp://akkademy@127.0.0.1:2552]

第二个项目是具有JClient类的客户:

public class JClient {

    private static final int TIMEOUT = 2000;
    private final ActorSystem system = ActorSystem.create("LocalSystem");
    private final ActorSelection remoteDb;

    public JClient(String remoteAddress) {
        remoteDb = system.actorSelection("akka.tcp://LocalSystem@" + remoteAddress + "/user/akkademy-db");
    }

    public CompletionStage set(String key, Object value) {
        return toJava(ask(remoteDb, new SetRequest(key, value), TIMEOUT));
    }

    public CompletionStage<Object> get(String key) {
        return toJava(ask(remoteDb, new GetRequest(key), TIMEOUT));
    }    
}

我传递了值&#34; 127.0.0.1:2552&#34;到remoteAddress,调用set / get方法,并遇到错误:

java.util.concurrent.ExecutionException: akka.pattern.AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://akkademy/deadLetters), Path(/user/.*)]] after [2000 ms]. Sender[null] sent message of type "javah.GetRequest".

2 个答案:

答案 0 :(得分:0)

actorSelection中,选择器应为格式为akka.tcp://${remoteActorSystemName}@${remoteAddress}/user/$actorPath的字符串。在您发布的代码段中,看起来您使用LocalSystem作为${remoteActorSystemName}而不是远程演员系统名称。

让我知道如果将其切换到远程工作,如果没有,您可以发布您正在使用的完整代码或链接吗?

答案 1 :(得分:0)

获取远程actor的ActorSelection的客户端代码不正确。而不是"LocalSystem",它是客户端actor系统的名称,而是使用"akkademy",即服务器的actor系统的名称。将JClient构造函数更改为以下内容:

public JClient(String remoteAddress) {
    remoteDb = system.actorSelection("akka.tcp://akkademy@" + remoteAddress + "/user/akkademy-db");
}