我的环境是Scala Akka和play!框架。我想知道是否有任何方法可以控制演员系统的创建或任何其他可以.
我的想法是创建远程参与者,当用户点击购买时处理授权。因此,当用户发布帖子时,我以操作方法创建远程参与者系统和参与者:
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()
}
这是应用程序中远程创建的定义。
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 系统而不会发生冲突。
任何想法、建议或帮助将不胜感激。
不要在每次调用时启动(远程)Actor系统。相反,请启动应用程序范围的Actor系统(或使用默认系统,请参阅将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 ?
}
}
}
然后使用默认的播放演员系统,例如在控制中获取对远程演员的引用:
private val interpreters = Akka.system.actorFor(
"akka://interpreter_system@127.0.0.1:2552/user/interpreters")
如果你想渲染演员的响应,你甚至可以将Akka Future转换为Scala Promise。我倾向于继续使用 Akka 期货来实现可组合性,然后在最后将Future[Result]
转换为承诺。
new AkkaPromise(
interpreters.ask(InterpretersComm.Request(sid, line)).mapTo[String]) map (Ok(_))