2012-11-12 60 views
0

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

谢谢。

+0

我们能否看到您的支持bean代码? –

+0

代码超过1200行,是否有必要? 算法如下: 1.从网上下载文件。 2.打开文件并更新数据库,直到没有文件保留。 3.关闭文件,完成! 你在问java代码还是xhmtl代码? – Viplime

+0

我想知道你的Bean的范围是什么,它管理过程 –

回答

1

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

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

你需要(至少):

  • @ApplicationScoped托管bean将包含和处理的任务。
  • 一种同时处理和执行一个或多个任务的方法。这可以通过ExecutorService或类似技术来实现。注意:不敢自己手动启动新线程,这只会导致杀死您的Web应用程序服务器。
  • 用于将用户映射到他/她已开始的任务的结构。它可以与Map<String, List<Task>>映射,以便单个用户此刻可以有超过1个任务。将它保存在数据库(或类似的)中会更好,以便为这些不驻留在内存中的任务创建日志。您甚至可以设计这个功能,以便如果您取消部署Web应用程序或服务器突然关闭,则可以从精力充沛的地方重新开始手头的任务。
+0

好的建议。谢谢答复。我的应用程序将仅供管理员使用。因此,我的应用程序只应运行一个实例,所有管理员都应该获得相同的进度数据。我想我不需要为此排队。 ,当我使我的应用程序@ApplicationScoped和关闭浏览器将应用程序继续运行? – Viplime

+0

是的,'@ ApplicationScoped'托管bean一直存在,直到应用程序被部署或Web应用程序服务器(Tomcat,JBoss,GlassFish等)关闭。 –

+0

我试过了@ApplicationScoped,它工作正常,谢谢你。谢谢你,我解决了这个问题:)。 – Viplime

相关问题