2012-11-12 95 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

相關問題