2012-05-18 188 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