播放框架运行长时间阻止任务,而不阻止客户端

时间:2016-04-14 18:25:14

标签: java multithreading akka playframework-2.4

  

在等待响应时将阻止Web客户端,但服务器上不会阻止任何内容,服务器资源可用于为其他客户端提供服务。

某些客户端请求要求我的服务器执行长阻塞任务。我知道我可以在一个单独的线程池中执行它们 但我也不希望客户端被阻止。我只想立即回复客户端(例如,确定了你的厚厚的长期阻止任务)。客户端不关心获取任务执行的结果,只需要知道我正在执行它。

如何在游戏中实现此行为?

我想我可以创建一个作业队列并使用另一个线程来处理作业队列。播放控制器仅将作业添加到队列中,而另一个线程从队列中执行作业。我应该这样做吗?我应该使用Akka演员吗? (我不知道阿卡,我需要学习它)

1 个答案:

答案 0 :(得分:1)

回调

这一切都始于回调。

你肯定见过这个:

Something.save(function(err) {  
  if (err)  {
    //error handling
    return;
  }
  console.log('success');
});

这是在JavaScript中定义一个回调 - 这将是异步执行的。由于他们的语法,实现和什么不是,回调并不是你的朋友。过度使用它们会导致可怕的回调地狱

承诺

在此背景下:ES6中的承诺

Something.save()  
  .then(function() {
    console.log('success');
  })
  .catch(function() {
    //error handling
  })

承诺不是'ES6-thing',它们已存在多年,ES6将它们带给您。承诺很好,甚至可以链接它们:

saveSomething()  
  .then(updateOtherthing)
  .then(deleteStuff)  
  .then(logResults);

但足够疯狂的异步。

的WebSocket

WebSocket是我推荐的:

  • 截至今日very well supported
  • Play 2.x中的精彩支持
  • 全双工TCP
  • 你终于可以抽出时间学习Akka;)

因此,您可以创建一个打开与Play应用程序的WebSocket连接的客户端。在服务器端,您可以handle WebSocket connections either with Akka actors(我推荐)或使用流上的回调。使用actor非常简单也很有趣 - 你定义了一个Actor - 当有人打开一个WebSocket连接时,会产生一个这个actor的实例,然后你在WebSocket频道收到的每条消息都会被演员接收 - 你可以专注于您的业务逻辑而无需考虑周围环境,然后将消息发回 - 这是Akka擅长的。