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