0

我做了一个 jsf 应用程序。这个应用程序有一个包含开始、停止按钮的菜单。当按下开始时,应用程序开始从网站获取数据,并更新它的数据库。应用程序还有更新过程的进度条。但是,这个过程需要很长时间才能完成。我希望当我关闭浏览器时,它应该继续更新数据库。此外,当我再次打开它时,我应该得到以前的状态。但是,这没有发生。当我关闭浏览器时应用程序也关闭了。我该怎么做?

谢谢。

4

1 回答 1

1

就我而言,我不会延长会话寿命。相反,创建一个任务并将执行任务的对象添加到@ApplicationScopedbean 中的队列中,并将启动作业的用户和作业状态保存在数据库(或任何其他地方)中。

当用户注销(手动注销或关闭 Web 浏览器)时,该任务仍将被执行,因为它由整个应用程序管理(而不是由请求或用户会话)。当用户再次登录时,他/她可以向这个应用程序队列询问任务的状态。

您将需要(至少):

  • @ApplicationScoped将包含和处理任务的托管 bean。
  • 一种同时处理和执行一个或多个任务的方法。这可以通过一种ExecutorService或类似的技术来实现。注意:不要自己手动启动新线程,这只会导致你的web应用服务器被kill掉。
  • 将用户与他/她已开始的任务映射的结构。它可以用 a 进行映射,Map<String, List<Task>>以便单个用户此时可以拥有多个任务。最好将其保存在数据库(或类似数据库)中,以便为这些不驻留在内存中的任务记录日志。您甚至可以这样设计,以便在取消部署 Web 应用程序或服务器突然关闭时,可以从保存状态点重新启动手头的任务。
于 2012-11-12T14:12:36.627 回答