子线程在javascript上的多线程捕获响应

时间:2017-05-17 06:21:34

标签: javascript java ajax multithreading

我有一个场景,无法找到合理的答案。所以直接发布问题!

情景 -

  1. 我发出ajax请求并发送要上传到服务器的文件。

  2. 在服务器(tomcat)上,我下载文件并开始处理。

  3. 我在主线程上运行下载文件方法,在新线程上运行 process-file方法,因为处理时间太长,我不希望用户等待长。

    我的问题

    Ajax响应将捕获下载文件方法的回调方法中的响应。

    我的流程文件方法也会返回状态响应,我需要在处理完成后在前端显示。

    但我不能,因为Runnable Interface的run方法返回类型为void。

    问题 -

    1. 如何从流程文件方法获取结果并作为响应发送到前端
    2. 如果我能够实现上述目标,我怎么能在前端javascript上捕获响应,因为主线程响应已经在ajax成功方法中被捕获。

1 个答案:

答案 0 :(得分:0)

首先:您可以使用CallableExecutorService流程文件方法获取结果。这是一个example。回到前端解释如下。

第二:由于您不想等待用户使用进程文件方法,因此您已经从主线程返回,并且您无法获得第二次返回请求。以下过程使您了解更好,更简单的解决方案。

  1. 流程文件方法指定 ID (例如UUID)。如果成功下载,请将其传递给流程文件方法并将 ID 主线程返回到前端。
  2. 然后处理完文件后,存储在数据库/您想要的任何位置,或将结果放入 Map<id, result> ,其中 ID 将是关键。
  3. 在前端,您会获得流程文件方法 ID 。您可以在特定时间间隔内调用ajax请求,以便将此 id 的结果发送到其他端点(例如/file/status/{id})。
  4. 在该端点中,如果要检索结果,您可以通过 id 地址获取结果,这是地图的关键,或者如果您存储在然后,您可以轻松地通过 id 并将其返回到前端。
  5. 如果您无法在地图/数据库中获得结果(如果文件处理尚未完成),您可以将例外发送到前端,以便您可以下一个间隔后再次发送请求。