1

我的环境是 scala 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的定义

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://ActorApplication@172.17.100.232:2552"
                                    router = "round-robin"
                                    nr-of-instances = 1
                            }
                    }
            }
            remote.netty.port = 2554
    }
}

我遇到的问题是,当我连续提交两次时,我得到一个错误,因为我试图在一个已经有一个演员系统的 IP 地址上创建一个演员系统。

我绝对认为我需要移动它,但我不确定在哪里,因为这将是一个广泛的多用户游戏!应用程序,当数百名用户使用该应用程序时,我不确定我可以将actor系统的创建放在哪里而不会发生冲突。

任何想法、建议或帮助表示赞赏。

4

1 回答 1

3

不要在每次调用时启动(远程)ActorSystem。相反,启动一个应用程序范围的演员系统(或使用默认的,请参阅集成 Play 与 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 ?
    }
  }
}

然后使用默认的 Play actorsystem 例如在您的控制器中获取对远程 actor 的引用:

private val interpreters = Akka.system.actorFor(
  "akka://interpreter_system@127.0.0.1:2552/user/interpreters")

如果你想渲染 Actor 响应,你甚至可以将 Akka Future 转换为 Scala Promise。我建议继续使用 Akka Futures 来实现可组合性,然后在最后一个词干将其转换Future[Result]为 Promise。

new AkkaPromise(
  interpreters.ask(InterpretersComm.Request(sid, line)).mapTo[String]) map (Ok(_))
于 2012-09-22T06:36:02.547 回答