我有一个场景,找不到合理的答案。所以直接发布问题!
场景 -
我发出一个 ajax 请求并发送一个要上传到服务器的文件。
在服务器(tomcat)上,我下载文件并开始处理它。
我在主线程上运行下载文件方法,在新线程上运行处理文件方法,因为处理时间太长,而且我不希望用户等待这么长时间。
我的问题:
Ajax 响应将在下载文件方法的回调方法中捕获响应。
我的处理文件方法还返回我需要在处理完成时在前端显示的状态响应。
但我不能,因为 Runnable Interface 的 run 方法的返回类型为 void。
问题 -
- 如何从处理文件方法获取结果并将其作为响应发送给前端
- 如果我能够实现上述目标,我如何捕获前端 javascript 上的响应,因为主线程响应已经被 ajax success 方法捕获。
请您参考如下方法:
第一:您可以使用Callable
从处理文件方法获得结果以及ExecutorService
。这是一个example 。下面回到前端进行解释。
第二:因为您不想等待用户处理文件方法,因此您已经从主线程返回,并且您无法通过单个请求获得第二次返回。以下过程让您了解针对这种情况更好、更简单的解决方案。
- 为处理文件方法分配一个id(例如
UUID
)。将其传递给 process-file 方法,如果下载成功,则将 id 从主线程返回到前端。 - 然后在处理您的文件后,存储到数据库/任何您想要的位置,或将结果放入
Map<id, result>
其中 id 将是键。 - 在前端,您可以获得流程文件方法的id。您可以在一定的时间间隔内调用 ajax 请求,以将此 id 的结果发送到不同的端点(例如
/file/status/{id}
)。 - 在该检索结果的端点中,您可以通过id( map 的键)从Map获取结果,或者如果您存储在数据库中,则可以轻松获取id并将其返回到前端。
- 如果您无法在 map /数据库中获取结果(如果文件处理尚未完成),您可以向前端发送异常,以便您可以在下一个间隔后再次发送请求。