Java Web应用程序和多线程

Java Web应用程序和多线程,java,ajax,multithreading,web-applications,Java,Ajax,Multithreading,Web Applications,我正在将桌面应用程序(WinForm)移植到web应用程序(Java/Spring/JPA)。问题很多,我有点挣扎 现在的问题是线程 在执行从数据库导出某些数据的原始应用程序中,有一个进度条指示流程的进度 我想把这个进度条移植到新的web应用程序中。为此,我考虑使用AJAX并使用单独的线程来运行数据导出 主要关注点是: 我是否遵循了正确的方法?在web应用程序中使用多线程是否存在问题 如果在导出过程中按下F5或刷新按钮,会发生什么情况?我怎样才能停止这个过程 如何定期更新进度条?我必须通过aj

我正在将桌面应用程序(WinForm)移植到web应用程序(Java/Spring/JPA)。问题很多,我有点挣扎

现在的问题是线程

在执行从数据库导出某些数据的原始应用程序中,有一个进度条指示流程的进度

我想把这个进度条移植到新的web应用程序中。为此,我考虑使用AJAX并使用单独的线程来运行数据导出

主要关注点是:

  • 我是否遵循了正确的方法?在web应用程序中使用多线程是否存在问题
  • 如果在导出过程中按下F5或刷新按钮,会发生什么情况?我怎样才能停止这个过程
  • 如何定期更新进度条?我必须通过ajax调用服务器吗

我主要是一名ASP.Net开发人员,但从我对HTTP协议的了解来看,这不是解决问题的方法。我已经看到了很多相当聪明的解决方案,但最终很清楚的是HTTP协议并不是设计成这样工作的

很明显,你知道flash或silverlight应用程序可以做到这一点,但这也有它自己的问题

我自己,我更喜欢把所有奇怪的东西都放在服务器上。过去,我必须想出一种方法,通过一个web应用程序发送数千封电子邮件,并向用户更新电子邮件的进展情况。我设计了一组表作为队列。web应用程序只需将任何传递请求放在此队列中,进度条将由检查队列中项目状态的请求确定。在后台运行的是一个windows服务,该服务还将检查此队列,并实际负责传递邮件,并在邮件完成或失败时设置每个项目的状态

这是一个有点困难的发展,因为windows服务可能是棘手的,但一旦它启动和运行,它是非常顺利和可靠的。根据您的具体情况,也许设置为每隔几分钟运行一次的简单计划任务就可以满足您的需要。

在线查找我的答案

我采取了正确的方法?在web应用程序中使用多线程是否存在问题

-是的,你在正确的道路上。不,在web应用程序中的多线程中不存在这样的问题,它就像在WinForm中一样简单。与使用Dispatcher更新UI不同,您将进行AJAX调用,并使用javascript进行DOM操作

如果在导出过程中按下F5或刷新按钮,会发生什么情况?如何停止该过程?

-不幸的是,没有简单的方法。标准方法是,当完成此类处理并且用户点击F5时,您将显示一个对话框(借助javascript),并通知用户作业仍在运行。如果用户仍要刷新,则您必须向服务器发出另一个取消任务的请求。(您需要将线程id或取消令牌存储在取消任务的某些位置)

如何定期更新进度条?我必须通过ajax调用服务器吗?

-标准方法是,通常显示加载图像。如果您想显示上下文相关的进度条,这意味着您必须进行轮询。这是迪诺·埃斯皮托的一个例子。虽然它在ASP.NET中,但您可以理解其基本原理
我不必直接为导出运行单独的线程。虽然这样做很理想,但web容器的这种能力将是一个限制因素。传统的JavaEE应用服务器通常不鼓励为此生成线程(尽管您可以为此连接到线程池)。有些容器非常擅长在工作完成之前将线程从阻塞中释放出来(例如,使用Jetty和Camel的Karaf),以便在导出过程中为其他web请求提供服务。但我的猜测是,在“开始导出”线程阻塞收到响应之前,您可能不会介意它

这个出口需要多长时间?几秒钟,还是几分钟?如果它比较短,我认为只要在它上面放一个带圆形微调器的小“等待”图标(使用您最喜欢的Ajax库,不管是什么)就足够了


如果你真的想要一个真正的状态栏,它会定期刷新自己,那么是的,你必须以一定的频率轮询它。这可能是一个简单的请求,将从该作业ID的数据库表中加载该作业的某种进度。

您是否查看并尝试过该解决方案?@luigimendoza尚未。。。我来看看。谢谢。所以,如果我错了,请纠正我,我可以启动一个执行“脏活”的线程,然后从我的网页上发出定时请求,以确定导出过程的进度……我不知道您使用的是哪种web服务器,但在web应用程序中生成线程总是让我感到不舒服。首先,在IIS中,如果在生成的线程中引发未捕获的异常,则可能导致整个Web服务器崩溃。我不确定这是否适用于Apache。该过程可能需要几分钟,因此我认为阻止主线程等待响应可能不是正确的方法。我可以通过一个异步请求启动该进程,并定期检查导出进程的进度……即使从浏览器的角度发出异步请求,服务器上为该请求提供服务的线程也会在后台阻塞。此时,它将无法为其他HTTP请求提供服务。如果您同意这一点,这是最简单的方法,但是如果您想释放它,那么这时您应该包含一个线程池,并通过执行器委托给可运行的