java - Play框架运行长阻塞任务,不阻塞客户端

标签 java multithreading akka playframework-2.4

The web client will be blocked while waiting for the response, but nothing will be blocked on the server, and server resources can be used to serve other clients.

一些客户端请求要求我的服务器执行长时间阻塞任务。我知道我可以在单独的线程池中执行它们。
但我也不希望客户端被屏蔽。我只想立即向客户端返回响应(例如,好的,完成您的厚长阻塞任务)。客户端并不关心获取任务执行的结果,它只需要知道我正在执行它。

我如何在游戏中实现这种行为?

我想我可以创建一个作业队列并使用另一个线程来处理作业队列。其中播放 Controller 仅将作业添加到队列中,另一个线程执行队列中的作业。我应该这样做吗?我应该使用 Akka actor 吗? (我不知道 Akka,我需要学习它)

最佳答案

回调

这一切都是从回调开始的。

你肯定见过这个:

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

这是在 JavaScript 中定义回调 - 将异步执行的东西。由于它们的语法、实现等等,回调并不是真正的你的 friend 。过度使用它们可能会导致可怕的回调 hell

promise

在此背景下:ES6 中的 Promise

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

Promise 不是“ES6 的东西”,它们已经存在很多年了,ES6 正在把它们带给你。 Promise 很好,你甚至可以将它们链接起来:

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 channel 中收到的每条消息都将由该 Actor 接收 - 您可以专注于您的业务逻辑,而无需考虑周围环境,然后将消息发回 - 这是 Akka 所擅长的。

关于java - Play框架运行长阻塞任务,不阻塞客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631090/

相关文章:

java - 汽车租赁 Java 实验室

java - 如何解决使用 JavaFX 在 Scene Builder 中绘制图表的问题

python - pycurl/curl 不遵循 CURLOPT_TIMEOUT 选项

scala - 在 Akka 指令中提取路径头

scala - Akka 主管捕获 future 的失败

java - 如何同步Java和JavaFX线程?

java - 使用命令提示符运行时找不到或加载主类

c++ - cppreference 中对宽松排序的解释是错误的吗?

c++ - 循环C++中的段错误Openmp

scala - 如何创建不受背压影响的 Source