我正在学习Akka远程教学,指的是 Learning Akka 这本书。
使用有限的网络,我无法使用sbt(无法很好地配置代理)。
首先,我使用application.conf
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".
答案 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");
}