我正在尝试使用宠物项目熟悉Akka。这基本上是一个锦标赛式的服务器,有一个玩家池。在每一轮中,它应该从池中取出两个随机玩家,互相对战,然后更新记分牌。整个事情都在HTTP服务器后面。通过HTTP Post消息添加玩家,并通过将从JS客户端发送的“播放”消息触发游戏。
我想实现它的方式如下:
我的问题是两个独立的演员正在与GameResults交谈 - 直接Spray和Round演员,并且显然正在创建两个独立的GameResults实例,因此当Round将结果添加到一个实例时,Spray正在阅读来自另一个实例的记分牌。显然我遗漏了一些非常基本的东西,在尝试解决问题之前,我想了解在Akka这样做的主流方式是什么?基本上这个问题可以简化为一个持有不同调用状态的actor。
很高兴有人指出我正确的方向。
答案 0 :(得分:1)
代码段示例如何将消息从spray传递给游戏结果actor:
希望这会有所帮助
object SomeApp extends App{
//create a actor system
val yourSystem = ActorSystem("Your-System")
//init spray actor
val restHandler = yourSystem.actorOf(Props[RestHandler], name = "Rest-spray")
//init play pool actor
val playerPoolActor = yourSystem.actorOf(Props[PlayerPool], name = "playerPool")
//INIT ONLY 1 game result actor
val gameResultsActor = yourSystem.actorOf(Props[GameResults], name = "gameResults")
//spray listen to all IP on port 90210
IO(Http)(yourSystem) ! Http.Bind(restHandler, interface = "0.0.0.0" , port = 90210)
class RestHandler extends Actor with RestHandlerRoute {
def actorRefFactory = context
//nice to hold the route in a diffrent trait
def receive = runRoute(someRoute)
}
}
//only thing the trait is doing is configuring the routing and send message to relavant actor
trait RestHandlerRoute extends HttpService{me: Actor =>
import SomeApp._
val someRoute =
path("getGameResults") { get { respondWithMediaType(`text/html`) { complete {
//case the user requested http://someIP:90210/getGameResults spray will send a message to the game result actor
gameResultsActor ! getResult
} ~
}