2011-12-30 60 views
0

在使用GWT應用程序時,我部署了新版本的應用程序。 部署完成後,我的應用程序凍結,直到完成全面更新。 我原本以爲這是緩存問題,因此我通過使用過濾器設置所有響應標頭,將所有文件分配爲no-cache。但是,當我部署新版本時,仍然會使用此篩選器應用程序凍結。GWT應用程序在使用它時部署新版本時會凍結

這可能是什麼原因?

我想在這裏實現的是能夠在用戶使用應用程序時部署新版本的GWT應用程序。這意味着當JavaScript更改時,我希望用戶從服務器獲取它,而不是使用緩存的沒有任何故障(可能因爲請求需要在此情況下需要轉到服務器的響應時間較慢)。

注意: 這是觀察部署時隨代碼的變化,所以我 猜測其中一個cache.js文件。 在未對代碼進行任何更改的情況下進行部署時,未觀察到此情況。

+0

你使用什麼app/web服務器? – milan 2011-12-30 09:47:43

+0

AppEngine with Java – Mayumi 2011-12-30 14:09:13

回答

2

你的問題是不明確的,因爲它不會告訴你是在什麼情況下:

  1. 你部署新的GWT應用程序,並希望新的服務器端響應舊的客戶端。

  2. 您部署新的GWT應用程序,並希望客戶端瀏覽器立即用新版本替換GWT客戶端。

我想先說說情況2。我認爲你來自servlet和JSP的背景,加上動態生成的HTML和Javascript。在那些環境中,每當客戶端請求服務器時,客戶端都會立即更換。這是因爲客戶端UI由服務器生成的新響應刷新。

在GWT中,根面板未刷新。根面板由託管html頁面保存。如果託管html頁面沒有刷新,GWT客戶端將永遠是舊版本。這是AJAX和GWT的想法。您不希望刷新網頁,而是允許網頁不斷髮出/接收異步請求/響應。

可能會提醒您,GWT已編譯爲javascript。

爲了獲得新版本,您必須刷新網頁。 GWT技術沒有辦法讓新的javascript潛入瀏覽器來替換舊的javascript組件,除非刷新頁面。

加載GWT JavaScripts時,腳本標記源鏈接已經被讀取。除非刷新頁面,否則這些鏈接將不會被重新讀取。如果這些鏈接不被重新讀取,那麼新的javascripts將不會被重新加載。

在處理AJAX時,您需要分離您的JSP/servlet體驗。

回到情況1 ..

由於未加載新的GWT UI版本,因爲你沒有執行刷新,你就必須通過與的老版本的用戶界面所期望的數據結構之間incongruences新的服務器端版本。如果你能保證RPC或客戶端 - 服務器數據結構和交換序列的穩定性,我相信你不應該有問題。

但是,對於GAE,序列號ID很重要。您可能更改了POJO的數據結構而不更新序列號ID。這會混淆GAE客戶端服務器的流量,因爲......嗯......我可以微弱地回想起我遇到的問題的確切順序 - 您最好自己仔細閱讀GAE pojo序列化標識。

+0

我們的情況是#2。就像你說的唯一的解決辦法是刷新託管的HTML。所以我們決定捕捉異常並提示用戶刷新瀏覽器。感謝您注意我的問題。應用程序凍結是由於在web.xml中過濾與模塊名稱相同的url模式,所以不會發生正常行爲。 – Mayumi 2012-01-09 06:06:20

1

問題出在你的web服務器而不是GWT本身。您應該看看您的Web服務器是否支持熱部署,以及它如何與它一起工作。

UPDATE: 例如Tomcat的之前版本不支持熱部署,你必須重新啓動每次更新而Tomcat 7服務器支持熱部署,你只需要重新加載頁面以獲得新的模塊

1

我也有這樣的問題。在這種情況下,您應該有一張保留每個新上傳信息的表格。而且你還應該有一個異步請求(可能在你的EntryPoint中)來檢查你是否有新的上傳。

public void success(String version) { 
    if(!Cookies.getCookie("version").equals(version)){ 
     Window.open(currentUrl, "_self", ""); 
    } 
} 

這是我做了什麼,並沒有任何問題的工作...

+0

因此,在入口處輪詢以不斷檢查cookie中的版本更改?問題在於,只有在用戶第一次在瀏覽器中加載GWT應用程序後纔會執行入口點。因此,目前使用該應用程序的用戶將不會執行此代碼.... – Mayumi 2011-12-30 14:12:43

+0

在這種情況下,我會用'Timer'來檢查它。 – 2011-12-31 08:41:02

相關問題