2012-09-21 216 views
1

我的環境是斯卡拉阿卡和玩!框架。我想知道是否有控制演員系統或任何其他想法的創建。Akka演員系統控制

我的想法是創建一個遠程演員,當用戶點擊購買時將處理授權。所以,我創建的操作方法的遠程系統的演員和演員,當用戶執行後:

def payment = Action { implicit request => 
    var actorObject: Array[String] = new Array[String](23) 

    val system = ActorSystem("RemoteSystem", ConfigFactory.load.getConfig("remotecreation") 

    val worker = system.actorOf(Props[authNetActor.AuthNetActorMain].withRouter(FromConfig()), name = "remoteActor") 
    ... 
    system.shutdown() 
} 

這裏是在application.conf

remotecreation {  #user defined name for the configuration 
    include "common" 
    akka { 
      actor { 
        serialize-messages = on 
        serialize-creators = on 

        serializers { 
          proto = "akka.serialization.ProtobufSerializer" 
          java = "akka.serialization.JavaSerializer" 
          arr = "models.ArraySerializer" 
        } 

        serialization-bindings { 
          "com.google.protobuf.Message" = proto 
          "java.lang.String" = java 
          "java.util.Arrays" = java 
          "scala.Array" = arr 
          "akka.actor.ActorRef" = java 
        } 

        deployment { 
          /remoteActor { #Specifically has to be the name of the remote actor 
            remote = "akka://[email protected]:2552" 
            router = "round-robin" 
            nr-of-instances = 1 
          } 
        } 
      } 
      remote.netty.port = 2554 
    } 
} 

的問題remotecreation的定義我遇到的情況是,當我連續兩次提交時,我得到一個錯誤,因爲我試圖在一個已經有一個actor系統的ip地址上創建一個actor系統。

我絕對認爲我需要移動它,但我不確定在哪裏,因爲這將是一個廣泛的多用戶遊戲!應用程序,我不確定我可以在哪裏將創建演員系統的位置在數百個用戶使用該應用程序時不會發生衝突。

任何想法,建議或幫助表示讚賞。

回答

3

每次調用都不要啓動(遠程)ActorSystem。相反,啓動一個應用程序範圍的角色系統(或者使用默認角色,請參閱integrating Play with Akka)。

添加到您的application.conf

akka { 

    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 

    remote { 
    transport = "akka.remote.netty.NettyRemoteTransport" 
    netty { 
     hostname = "127.0.0.1" 
     port = 0 # 2552 seems to be bound with play 2.0.2 ? 
    } 
    } 
} 

然後使用例如默認播放actorsystem去你contorller遠程演員的引用:

private val interpreters = Akka.system.actorFor(
    "akka://[email protected]:2552/user/interpreters") 

你甚至可能轉換的阿卡未來到斯卡拉承諾如果你想渲染演員的迴應。我希望繼續使用Akka Futures進行組合性分析,然後在最後一步將Future[Result]轉換爲Promise。

new AkkaPromise(
    interpreters.ask(InterpretersComm.Request(sid, line)).mapTo[String]) map (Ok(_)) 
+0

這些例子來自我的一個使用遠程scala解釋器的玩具項目。 – ron