2012-09-17 45 views
0

我正在运行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遥控?

+1

我觉得你犯了一个错误:当你在9002端口上启动远程播放服务器时,它只是HTTP服务器,它监听9002端口,而不是Akka端口。 –

+0

是的,我需要启动RemoteNodeApplication通过akka.kernel.Bootable或通过使用Controller的路由,我必须要初始化RemoteNodeApplication类。我已经解决了这个问题。我会发布解决方案。谢谢nico_ekito。 – Santosh

+0

是的,请张贴您的解答为其他用户:-) –

回答

0

远程应用程序需要部署为akka microkernal中的jar。远程应用程序启动后,您可以运行本地 应用程序以连接到远程应用程序。回答write2munish

+0

感谢您的第一suggestioj。但现在我有另一个问题,并且当我运行系统时,系统回复留下1条消息。这里是错误:未来被称为 [INFO] [09/30/2012 16:47:25.669] [Application-akka.actor.default-dispatcher-1] [/ application/user/$ a] Messagefrom服务器警告参数剩下:1 你有什么建议。我正在尝试使用未来来检索简单的消息 –