java - 在 Web 应用程序中实现长时间运行的流程

标签 java jquery spring

出于某种原因,我在谷歌上找不到解决方案。我在网络应用程序中可以选择上传大量数据(在文件中)并通过后端处理(我们使用 Java/Spring)来存储这些数据。大约需要 5 分钟。有谁知道用户可以启动此进程并执行其他操作的方式以及何时完成通知用户?

我正在考虑的一个解决方案(不确定是否有更好的解决方案,这就是我在这里的原因)是进行 AJAX 调用(我们碰巧使用 jQuery 库),它将文件传递给 Controller ​​,然后在 Controller 处理文件时,它会定期向流发送一些小内容,这样就不会发生超时,然后一旦完成,它就会通知 Web 应用程序,并通知用户。

最佳答案

我最近必须解决这样的问题,而且非常简单。他就是我这么说的原因。

  1. 使用 HTTP 1.1 协议(protocol),服务器连接将保持打开状态,直到返回请求的最后一个资源为止。任何符合 HTTP 1.1 的 Web 服务器都会在幕后为您执行此操作,而无需您付出任何努力。仅此一点就可以让您的问题更容易解决

  2. 使用 servlet 3.0,您应该利用新的异步功能(尽管您可以在 servlet < 3.0 中自行推出类似的功能)。服务器从其线程池中为每个传入请求分配一个新线程。然后使用您自己的自定义线程池,将此请求线程的处理与 asyncContext 一起移交给自定义线程。您自己的线程将处理这个长时间运行的进程,并且服务器的线程立即返回以处理其他请求。 asyncContext 包含原始请求/响应对象,但它们处于“卡住”状态。当长时间运行的进程完成时,它将调用 asyncContext.complete() 方法。此操作将提交处于“卡住”状态的原始请求/响应。

  3. 对于客户端来说,这个异步过程看起来服务器需要很长时间才能响应,因此客户端将耐心等待响应。您不需要做任何异常的事情。

  4. 在客户端,任何调用ajax请求的方法都足够了。不需要投票。客户会很高兴地坐下来等待答复。 xmlHttpRequest 对象的“readyState”属性将为您处理这个问题。服务器提交响应后,“readyState”值将更改为 4,您可以从那里更新 UI。

在服务器端,您可能应该将具有长时间运行进程的方法的类包装在一个内部类中,然后该内部类将调用长时间运行的进程,并保存一个 boolean 属性,例如“running = true/false”。这样,如果在长时间运行的请求中,有人尝试再次调用同一进程,他们将能够知道它是否已经在运行。现在这比您要求的更多详细信息。

无论如何,我希望我能有所帮助,同时为您提供如何继续前进的线索。

关于java - 在 Web 应用程序中实现长时间运行的流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004527/

相关文章:

java - 乒乓 Racket 运动问题

javascript - 通过 AJAX 填充下拉列表失败

javascript - 获取从一个函数到另一个函数的 <a> 标签的 id

java - 重载 Spring Controller 方法以获取可变请求参数

java - NetBeans Hibernate 逆向工程数据类型不匹配

java - 将 isElementPresent() 从 Selenium 1 迁移到 Selenium 2 时如何避免超时?

java - Python:可以将文本发送到已经运行的java应用程序的标准输入吗?

jquery - 允许使用 jQuery.Wipetouch 进​​行捏合缩放

javascript - Spring Boot应用程序更改页面

java - spring @Controller 和 @RestController 注解的区别