Play Framework是否适合异步后台处理?

时间:2013-11-09 16:24:47

标签: java web-applications playframework playframework-2.0 akka

我打算建立一个即将举办城市游戏的网络应用程序。

用户访问我的网站,点击“开始游戏”并在到达某个位置时开始接收一些短信,并且必须回答它们才能获得积分。

Play适合这种应用吗?点击“开始游戏”按钮后,一些逻辑必须按照自己的方式进行。我将如何平行地检查玩家的地理定位(我有API)?我想每隔约5秒钟对播放器进行一次ping操作。并做一些逻辑。用户当然必须能够在处理他的位置,分配点,发送和接收消息等的同时使用Web应用程序。

总而言之:我想要一个用Play编写的应用程序,在点击“开始游戏”之后为游戏启动一个单独的线程,而其他用户可以查看他们的数据(statisctics等),同时线程以他们的方式工作与游戏逻辑。

我找到了类似jobs的内容,但它们已针对1.2版本进行了记录。经过一番阅读后发现Akka现在是推荐的,但它使用的是演员模型。

Play + Akka是我项目的不错选择吗?

1 个答案:

答案 0 :(得分:4)

绝对。使用Play Framework在单独的ThreadPool(也称为ExecutionContext)中设置计算非常容易。您可能希望阅读documentation here,但简而言之,您可能希望在Application.scala控制器文件中执行此类操作(请注意,此示例使用Scala):

  // Async Action that's triggered when a user clicks "Start Game".
  // Runs logic in separate gameLogicContext thread pool and asynchronously returns a response without blocking of Play's default thread pool.
  def startGame = Action.async { implicit request =>

    Future {

      // ... your game logic here. This will be run in gameLogicContext

      Ok("Game started in separate thread pool") // http response

    }(Contexts.gameLogicContext) // the thread pool the future should run in.

  }

然后,您将在application.conf文件中设置一个单独的gameLogicContext线程池:

play {
  akka {
    actor {
      game-logic-context = {
        fork-join-executor {
          parallelism-min = 300
          parallelism-max = 300 // thread pool with 300 threads
        }
      }
    }
  }
}