3

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

现在的问题是线程!

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

我想将此进度条移植到新的 Web 应用程序中。为此,我想到了使用 AJAX 并使用单独的线程来运行数据导出。

主要担忧是:

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

3 回答 3

1

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

显然,您知道 Flash 或 Silverlight 应用程序可以做到这一点,但这也带来了一系列问题。

我自己更喜欢将所有奇怪的东西都保留在服务器上。过去,我不得不想出一种方法来通过 Web 应用程序发送数千封电子邮件,并让用户了解它的进展情况。我设计了一组表来充当队列。Web 应用程序将简单地将任何交付请求放在此队列中,进度条将由检查队列中项目状态的请求确定。在后台运行的是一个 Windows 服务,它也会检查这个队列,并且实际上负责传递邮件并在每个项目完成或失败时设置它的状态。

开发有点困难,因为 Windows 服务可能很棘手,但一旦启动并运行,它就非常流畅和可靠。根据您的情况,设置为每隔几分钟运行一次的简单计划任务可能会为您解决问题。

于 2012-05-29T16:19:59.187 回答
1

我不一定会直接跳到为导出显式运行单独的线程。虽然这样做是理想的,但 Web 容器的能力将成为一个限制因素。您的传统 Java EE 应用程序服务器通常不鼓励为此生成线程(尽管您可以为此连接到线程池)。一些容器非常擅长在工作完成之前将线程从阻塞中释放出来(例如,使用 Jetty 和 Camel 的 Karaf),以便它们可以在导出发生时为其他 Web 请求提供服务。但我的猜测是,在收到响应之前,您可能对“开始导出”线程阻塞没有问题。

这个出口需要多长时间?几秒钟,还是我们在这里谈论接近几分钟?如果它更短,我认为只需在其上放置一个带有小圆形微调器的小“等待”图标(使用您最喜欢的 Ajax 库,无论如何)就足够了。

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

于 2012-05-29T16:26:31.337 回答
0

在线查找我的答案

我遵循正确的方法?在 Web 应用程序中使用多线程有问题吗?

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

如果在导出过程中按下 F5 或刷新按钮,究竟会发生什么?我如何停止这个过程?

- 不幸的是,没有简单的方法。标准方式是,当此类处理完成并且用户点击 F5 时,您将显示一个对话框(在 javascript 的帮助下)并通知用户该作业仍在运行。如果用户仍然想刷新,那么您已经向服务器发出另一个请求以取消任务。(您需要将线程 ID 或取消令牌存储在某个地方以取消任务)

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

- 标准方式是,通常您显示加载图像。如果您想显示上下文相关的进度条,则意味着您必须进行轮询。这是 Dino Espito 的一个例子。虽然它在 ASP.NET 中,但您可以理解 Dino Espito的基本原理

于 2012-05-29T16:20:26.727 回答