Java Web应用程序和多线程
我正在将桌面应用程序(WinForm)移植到web应用程序(Java/Spring/JPA)。问题很多,我有点挣扎 现在的问题是线程 在执行从数据库导出某些数据的原始应用程序中,有一个进度条指示流程的进度 我想把这个进度条移植到新的web应用程序中。为此,我考虑使用AJAX并使用单独的线程来运行数据导出 主要关注点是:Java Web应用程序和多线程,java,ajax,multithreading,web-applications,Java,Ajax,Multithreading,Web Applications,我正在将桌面应用程序(WinForm)移植到web应用程序(Java/Spring/JPA)。问题很多,我有点挣扎 现在的问题是线程 在执行从数据库导出某些数据的原始应用程序中,有一个进度条指示流程的进度 我想把这个进度条移植到新的web应用程序中。为此,我考虑使用AJAX并使用单独的线程来运行数据导出 主要关注点是: 我是否遵循了正确的方法?在web应用程序中使用多线程是否存在问题 如果在导出过程中按下F5或刷新按钮,会发生什么情况?我怎样才能停止这个过程 如何定期更新进度条?我必须通过aj
- 我是否遵循了正确的方法?在web应用程序中使用多线程是否存在问题
- 如果在导出过程中按下F5或刷新按钮,会发生什么情况?我怎样才能停止这个过程
- 如何定期更新进度条?我必须通过ajax调用服务器吗
我不必直接为导出运行单独的线程。虽然这样做很理想,但web容器的这种能力将是一个限制因素。传统的JavaEE应用服务器通常不鼓励为此生成线程(尽管您可以为此连接到线程池)。有些容器非常擅长在工作完成之前将线程从阻塞中释放出来(例如,使用Jetty和Camel的Karaf),以便在导出过程中为其他web请求提供服务。但我的猜测是,在“开始导出”线程阻塞收到响应之前,您可能不会介意它 这个出口需要多长时间?几秒钟,还是几分钟?如果它比较短,我认为只要在它上面放一个带圆形微调器的小“等待”图标(使用您最喜欢的Ajax库,不管是什么)就足够了
如果你真的想要一个真正的状态栏,它会定期刷新自己,那么是的,你必须以一定的频率轮询它。这可能是一个简单的请求,将从该作业ID的数据库表中加载该作业的某种进度。您是否查看并尝试过该解决方案?@luigimendoza尚未。。。我来看看。谢谢。所以,如果我错了,请纠正我,我可以启动一个执行“脏活”的线程,然后从我的网页上发出定时请求,以确定导出过程的进度……我不知道您使用的是哪种web服务器,但在web应用程序中生成线程总是让我感到不舒服。首先,在IIS中,如果在生成的线程中引发未捕获的异常,则可能导致整个Web服务器崩溃。我不确定这是否适用于Apache。该过程可能需要几分钟,因此我认为阻止主线程等待响应可能不是正确的方法。我可以通过一个异步请求启动该进程,并定期检查导出进程的进度……即使从浏览器的角度发出异步请求,服务器上为该请求提供服务的线程也会在后台阻塞。此时,它将无法为其他HTTP请求提供服务。如果您同意这一点,这是最简单的方法,但是如果您想释放它,那么这时您应该包含一个线程池,并通过执行器委托给可运行的