我做了一个 jsf 应用程序。这个应用程序有一个包含开始、停止按钮的菜单。当按下开始时,应用程序开始从网站获取数据,并更新它的数据库。应用程序还有更新过程的进度条。但是,这个过程需要很长时间才能完成。我希望当我关闭浏览器时,它应该继续更新数据库。此外,当我再次打开它时,我应该得到以前的状态。但是,这没有发生。当我关闭浏览器时应用程序也关闭了。我该怎么做?
谢谢。
我做了一个 jsf 应用程序。这个应用程序有一个包含开始、停止按钮的菜单。当按下开始时,应用程序开始从网站获取数据,并更新它的数据库。应用程序还有更新过程的进度条。但是,这个过程需要很长时间才能完成。我希望当我关闭浏览器时,它应该继续更新数据库。此外,当我再次打开它时,我应该得到以前的状态。但是,这没有发生。当我关闭浏览器时应用程序也关闭了。我该怎么做?
谢谢。
就我而言,我不会延长会话寿命。相反,创建一个任务并将执行任务的对象添加到@ApplicationScoped
bean 中的队列中,并将启动作业的用户和作业状态保存在数据库(或任何其他地方)中。
当用户注销(手动注销或关闭 Web 浏览器)时,该任务仍将被执行,因为它由整个应用程序管理(而不是由请求或用户会话)。当用户再次登录时,他/她可以向这个应用程序队列询问任务的状态。
您将需要(至少):
@ApplicationScoped
将包含和处理任务的托管 bean。ExecutorService
或类似的技术来实现。注意:不要自己手动启动新线程,这只会导致你的web应用服务器被kill掉。Map<String, List<Task>>
以便单个用户此时可以拥有多个任务。最好将其保存在数据库(或类似数据库)中,以便为这些不驻留在内存中的任务记录日志。您甚至可以这样设计,以便在取消部署 Web 应用程序或服务器突然关闭时,可以从保存状态点重新启动手头的任务。