我正在运行java(1.6)中的akka远程处理(2.0.2)的示例示例,并且没有从远程获取结果。看来我的本地节点不能连接到远程音符。Java中的Akka远程处理:没有远程结果
LocalNodeApplication代码位于本地系统上,RemoteNodeApplication代码位于远程系统上。
请参考代码:
本地节点 -
public class LocalNodeApplication extends Controller {
public static Result process(String msg) throws Exception {
ActorSystem _system = ActorSystem.create("LocalNodeApp", ConfigFactory.load().getConfig("LocalSys"));
ActorRef localActor = _system.actorOf(new Props(LocalActor.class));
localActor.tell("Hello");
Thread.sleep(5000);
_system.shutdown();
return ok("success");
}
}
LocalActor代码:
public class LocalActor extends UntypedActor {
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
Timeout timeout = new Timeout(Duration.parse("5 seconds"));
ActorRef remoteActor;
@Override
public void preStart() {
//Get a reference to the remote actor
remoteActor = getContext().actorFor("akka://[email protected]:9002/user/remoteActor");
}
@Override
public void onReceive(Object message) throws Exception {
Future<Object> future = Patterns.ask(remoteActor, message.toString(), timeout);
String result = (String) Await.result(future, timeout.duration());
log.info("Message received from Server -> {}", result);
/*remoteActor.tell(message.toString());*/
}
}
LocalSys配置:
LocalSys {
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
deployment {
/remoteActor {
remote = "akka://[email protected]:9002"
}
}
}
}
}
远程节点代码 -
RemoteNodeApplication
public class RemoteNodeApplication implements Bootable {
final ActorSystem system = ActorSystem.create("RemoteNodeApp", ConfigFactory.load().getConfig("RemoteSys"));
public void shutdown() {
system.shutdown();
}
public void startup() {
system.actorOf(new Props(RemoteActor.class), "remoteActor");
}
}
RemoteActor:
public class RemoteActor extends UntypedActor {
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
// Get reference to the message sender and reply back
getSender().tell(message + " got something");
}
}
}
RemoteSys配置 -
RemoteSys {
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
untrusted-mode = on
transport = "akka.remote.netty.NettyRemoteTransport"
netty {
hostname = "192.168.0.85"
port = 9002
}
}
}
}
我本地节点上和远程启动戏 “跑9002” 开始玩 “跑9000”。
我得到以下提到的例外:
[INFO] [09/17/2012 17:42:52.206] [play-akka.actor.actions-dispatcher-1] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:2552
[INFO] [09/17/2012 17:42:52.406] [LocalNodeApp-akka.actor.default-dispatcher-4] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:9002
[INFO] [09/17/2012 17:42:52.438] [LocalNodeApp-akka.actor.default-dispatcher-1] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:9002
[ERROR] [09/17/2012 17:42:57.281] [LocalNodeApp-akka.actor.default-dispatcher-4] [akka://LocalNodeApp/user/$a] Timed out
akka.pattern.AskTimeoutException: Timed out
at akka.dispatch.DefaultPromise.result(Future.scala:875)
at akka.dispatch.Await$.result(Future.scala:74)
at akka.dispatch.Await.result(Future.scala)
at com.localNodeApp.LocalActor.onReceive(LocalActor.java:30)
at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:154)
at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:153)
at akka.actor.Actor$class.apply(Actor.scala:318)
at akka.actor.UntypedActor.apply(UntypedActor.scala:93)
at akka.actor.ActorCell.invoke(ActorCell.scala:626)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
at akka.dispatch.Mailbox.run(Mailbox.scala:179)
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516)
at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
Caused by: akka.pattern.AskTimeoutException: Timed out
at akka.pattern.PromiseActorRef$$anonfun$1.apply$mcV$sp(AskSupport.scala:274)
at akka.actor.DefaultScheduler$$anon$6$$anon$7.run(Scheduler.scala:183)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:94)
at akka.jsr166y.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1381)
... 4 more
[INFO] [09/17/2012 17:42:57.318] [LocalNodeApp-akka.actor.default-dispatcher-4] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:2552
当我上运行的本地节点和远程节点(这个变化的IP地址,本地系统)本地系统相同的例子下面让在控制台上提到的线路:
[INFO] [09/17/2012 17:42:52.206] [play-akka.actor.actions-dispatcher-1] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:2552
[INFO] [09/17/2012 17:42:52.406] [LocalNodeApp-akka.actor.default-dispatcher-4] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:9002
[INFO] [09/17/2012 17:42:52.438] [LocalNodeApp-akka.actor.default-dispatcher-1] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:9002
[INFO] [09/17/2012 17:42:57.318] [LocalNodeApp-akka.actor.default-dispatcher-4] [ActorSystem(LocalNodeApp)] REMOTE: [email protected]://[email protected]:2552
请指导我这一点。 我按照正确的步骤进行akka遥控?
我觉得你犯了一个错误:当你在9002端口上启动远程播放服务器时,它只是HTTP服务器,它监听9002端口,而不是Akka端口。 –
是的,我需要启动RemoteNodeApplication通过akka.kernel.Bootable或通过使用Controller的路由,我必须要初始化RemoteNodeApplication类。我已经解决了这个问题。我会发布解决方案。谢谢nico_ekito。 – Santosh
是的,请张贴您的解答为其他用户:-) –