我正在将桌面应用程序(WinForm)移植到Web应用程序(Java / Spring / JPA)。问题很多,我有点挣扎......
现在问题是线程化!
在执行从数据库导出某些数据的原始应用程序中,有一个进度条指示进程的进度。
我想在新的Web应用程序中移植此进度条。为此,我考虑使用AJAX并使用单独的线程来运行数据导出。
主要关注点是:
答案 0 :(得分:1)
我主要是ASP.Net开发人员,但据我所知的HTTP协议,这不是解决问题的方法。我已经看到了很多相当聪明的解决方案,但最后很清楚的是,HTTP协议的设计并不像这样。
显然你知道flash或silverlight应用程序可以做到这一点,但它带来了它自己的一系列问题。
我自己更喜欢在服务器上保留所有的怪异。在过去,我不得不想出一种通过Web应用程序提供数千封电子邮件的方法,并向用户介绍它是如何发布的。我设计了一组表作为队列。 Web应用程序只是将任何传递请求放在此队列中,进度条将由检查队列中项目状态的请求确定。在后台运行的是一个Windows服务,它也会检查这个队列,实际上负责传递邮件并设置每个项目完成或失败时的状态。
开发有点困难,因为Windows服务可能很棘手,但一旦启动并运行它就非常流畅可靠。根据您的具体情况,可能每隔几分钟设置一个简单的计划任务就可以解决问题。
答案 1 :(得分:1)
我不一定会直接为导出明确地运行一个单独的线程。尽管这样做是理想的,但Web容器执行此操作的能力将成为限制因素。您的传统Java EE应用服务器通常不鼓励为此生成线程(尽管您可以为此连接到线程池)。有些容器可以很好地解除线程阻塞直到工作完成(例如,带有Jetty和Camel的Karaf),这样他们就可以在导出过程中为其他Web请求提供服务。但我的猜测是,你可能会对“开始导出”线程阻塞,直到它收到响应。
这次出口需要多长时间?几秒钟,或者我们在这里谈几分钟?如果它更短,我认为只需在其上放置一个带有小圆形微调器的“等待”图标(使用您喜欢的Ajax库,无论是什么)就足够了。
如果你真的想要一个定期刷新的真实状态栏,那么是的你必须在某个频率上轮询它。据推测,这可能是一个简单的请求,它会从作业ID的数据库表中为作业加载某种进度。
答案 2 :(得分:0)
在线查找我的答案
我正在遵循正确的方法?在Web应用程序中使用多线程是否存在问题?
- 你是正确的道路。在Web应用程序中的多线程中没有这样的问题,就像在WinForm中一样容易。您将进行AJAX调用而不是使用Dispatcher更新UI,而是使用javascript DOM操作。
如果在导出过程中按下F5或刷新按钮究竟发生了什么?我如何停止这个过程?
- 遗憾的是没有简单的方法。标准方法是,当完成此类处理并且用户点击F5时,您将显示一个对话框(借助javascript)并通知用户该作业仍在运行。如果用户仍想刷新,那么您已向服务器发出另一个请求以取消该任务。(您需要将线程ID或取消令牌存储在取消任务的位置)
如何定期更新进度条?我是否必须通过ajax拨打电话到服务器?
- 标准方式是,通常你会显示加载图像。如果您想要显示上下文敏感进度条,则表示您必须进行轮询。以下是Dino Espito的一个例子。虽然它在ASP.NET中,但您可以理解其基本原理 Dino Espito