2009-02-11 70 views
4

我有一個顯示由JFreeChart呈現的一些圖表的GWT應用程序。每隔幾分鐘,頁面刷新一次,這會導致應用程序生成新的圖表。 (換句話說,整個圖表生成過程由客戶端請求引導)。問題在於多個客戶端命中同一個服務器會導致生成圖表的多個請求,但由於所有用戶的圖表都是相同的,真的沒有理由這樣做。我希望在後臺線程中預渲染圖表,並在應用程序啓動時啓動後臺線程,然後根據請求將已提供的圖表提供給客戶端。在GWT啓動時啓動後臺線程

我沒有在GWT中看到任何「認可」的方式來在服務器啓動時執行您自己的代碼。我能想到的唯一方法就是創建一個在應用程序容器啓動時加載的servlet,並在init()方法中啓動圖表生成線程。

有沒有更好的方法來做到這一點?

注意:假設它是真的,「否」是一個完全可以接受的答案。

回答

6

回答你的問題:不可以。GWT是一種前端技術,跨越這條線的唯一GWT是RPC機制。你可以做的唯一的'GWT'類型的方法是檢查圖表文件在用戶第一次請求時是否存在,如果不存在則生成它們。這意味着使用文件系統來檢查它是否已創建或尚未創建。

更好的方法是做你說的話,例如:配置你的web項目以在啓動時啓動一個類。

http://wiki.metawerx.net/wiki/Web.xml.LoadOnStartup

這裏的條紋是如何做的一個例子:這裏描述你在web.xml中做到這一點

<servlet> 
     <servlet-name>StripesDispatcher</servlet-name> 
     <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>StripesDispatcher</servlet-name> 
     <url-pattern>*.action</url-pattern> 
    </servlet-mapping> 
+0

+1條紋! :) – 2012-09-30 17:01:13

2

首先,我不同意事先海報,GWT是隻是一種前端技術,因爲該框架包含了異步構建和調用服務的所有內容。例如,請參閱RemoteServiceServlet和用法。 GWT提供客戶端和服務器端組件。

話雖如此,GWT似乎並沒有專門的啓動類型servlet。但是,由於後端是基於servlet的,爲了保持一致性,我傾向於使用啓動servlet(在google搜索Loading Servlets on Startup),並讓它在啓動時生成圖表,然後根據需要定期生成圖表。

另一種方法是讓cron作業定期重新構建圖表,直接或通過調用私人服務。

無論採用哪種方式,客戶端請求都會檢索預先生成的圖表。當生成一個新圖表時,只需將其替換爲舊圖表,以便用戶沒有明顯的滯後。

0

GWT是一個前端框架。我確實有一些特定的服務器組件,但這些組件僅用於序列化/反序列化客戶端的請求。請記住,前端是JavaScript,後端是java。所以服務器組件將一個JavaScript對象轉換爲它的java表示。如果你看看你的代碼,你可以注意到GWT RemoteServiceServlet只是像任何servlet一樣繼承了標準「javax.servlet.http.HttpServlet」。它只是實現自己的doPost和doGet方法來進行序列化。

這就是說,你的問題可以適用於衆多的其他框架。它不依賴於GWT。你只需要配置你的servlet容器在啓動時啓動GWT RemoteServiceServlet。 servlet可以擁有所有客戶端使用的靜態緩存並提供相同的圖表。然後,您可以在啓動時啓動第二個線程,以定期更新線程。

+0

它就像你說的那樣編組。 GWT也處理方法綁定,這很有幫助。我的觀點是,它既是前端也是後端,是爲了對抗GWT爲客戶服務的觀念,而且你必須在後端與其結合。您只需實現servlet方法。 – 2009-02-12 13:49:47

3

我不同意你應該把代碼放在servlet初始化中來創建這些線程。當Web應用程序停止時,您無法控制何時銷燬這些線程。當你再次啓動Web應用程序時,它會再次創建這些線程嗎?

最好是使用名爲contextInitialized的J2EE ServletContextListener事件來創建線程和contextDestroyed事件來銷燬您的線程。這也可以讓你控制線程銷燬並等待線程中的代碼在銷燬之前完成執行。

看起來這解釋瞭如何工作的: http://www.java-tips.org/java-ee-tips/java-servlet/how-to-work-with-servletcontextlistener.html