2012-05-18 140 views
0

我想创建一个可以远程访问和本地访问的actor。 下面创建的actor会引发异常。任何想法?Akka演员创作问题

val myLocalActor2 = system.actorOf(Props[ActorNodes], name = "akka://[email protected]:2552/MyOwnRef")

这是通过编程创建的本地和远程的最佳和唯一的方式和演员?

回答

1

actorOf中的“名称”只是一个路径段。这将确定新创建的演员。在这里看到更多的信息:http://doc.akka.io/docs/akka/2.0.1/general/addressing.html

此外,有东西是本地和远程都没有意义,但我认为你的意思是它应该是本地的,并可以从一些远程节点访问?如果是这样,只是actorOf创建它,其他节点可以查找它使用“actorFor”:

val remoteActor = system.actorFor("akka://[email protected]:2552/user/simpleCalculator") 

了解更多关于在这里:​​http://doc.akka.io/docs/akka/2.0.1/scala/remoting.html

在一般情况下,请阅读文档,我们已经倒了好几个小时,当人们不读它时感觉很浪费。

+0

嗨维克托,我的确的意思是,“本地创建”,但远程和本地透明可用。因此,我想给演员一个特定的路径创建一个本地创建,以便我可以远程查看它。所以的确问题是如何使用actorOf为我的本地演员分配一个路径?这个想法也是广播这些信息,以便远程客户端需要明确知道远程节点的位置,但他们可以在某种全局注册表中查找它? (顺便说一句,我阅读文档) – jts

+0

要有一个全球性的注册表,你需要达成共识,为了达成共识,你需要某种形式的集群。我们目前正在为Akka实施集群解决方案,但现在您需要通过其他一些共识来解决这个问题。 –

+0

好的。谢谢。我想我会使用某种使用jGroups的广播。 – jts

0

得到它的工作(除了全球注册表):

case class ActorMsg(val msg: String) 

sealed class ActorNodes extends Actor { 
    override def receive = { 
    case ActorMsg(msg) => println("Actor Msg " + msg) 
    case _ => println("Everything else") 
    } 
} 

object JtsListener extends App { 
    val sys = "JtsSystem" 
    val system = ActorSystem(sys) 
// println("System: " + system.settings) 

    val myLocalActor1 = system.actorOf(Props[ActorNodes], "MyLocalRef") 
    println("MyLocalActor 1: " + myLocalActor1 + " has path " + myLocalActor1.path) 
    myLocalActor1 ! new ActorMsg("Hello") 

    val myLocalActor2 = system.actorFor("akka://"+sys+"@127.0.0.1:2552/user/MyLocalRef"); 
    println("MyLocalActor 2: " + myLocalActor2 + " has path " + myLocalActor2.path) 
    myLocalActor2 ! new ActorMsg("Hello Again") 
} 

与application.conf(我在看的ActorSystem编程这样

THX

下一步将是广播该信息,以便所有服务都知道每个演员的位置..可能使用这里概述的想法:

http://blog.vasilrem.com/even-simpler-scalability-with-akka-through-re