在使用它时部署新版本时,GWT应用程序会冻结

时间:2011-12-30 06:33:07

标签: gwt deployment

在使用GWT应用程序时,我部署了新版本的应用程序。 部署完成后,我的应用程序冻结,直到我完全刷新。 我原本以为这是缓存问题,所以我通过使用过滤器设置所有响应头来将所有文件分配为no-cache。但是,当我部署新版本时,此过滤器应用程序仍会冻结。

这可能是什么原因?

我在这里想要实现的是能够在用户使用该应用程序时部署新版本的GWT应用程序。这意味着当JavaScript发生变化时,我希望用户从服务器获取它而不是使用缓存的缓存(可能是响应时间很慢,因为在这种情况下请求需要转到服务器)。

注意: 在使用代码中的更改进行部署时会观察到这一点,所以我是 猜测一个cache.js文件。 在没有对代码进行任何更改的情况下部署时,未观察到此情

3 个答案:

答案 0 :(得分:2)

您的问题不明确,因为它不能说明您所处的情况:

  1. 您部署新的GWT应用程序,并希望新的服务器端响应旧的客户端。

  2. 您部署新的GWT应用程序,并希望客户端浏览器立即用新版本替换GWT客户端。

  3. 首先,我想谈谈情况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版本,因为您没有执行刷新,因此旧UI版本所期望的数据结构与新服务器端版本的数据结构之间会存在不一致。如果你能保证RPC或客户端 - 服务器数据结构和交换顺序的稳定性,我相信你应该没有问题。

    但是,对于GAE,序列化ID很重要。您可能在不更新序列化ID的情况下更改了POJO的数据结构。这会混淆GAE客户端 - 服务器流量,因为......嗯...我可以隐约回想起我遇到的问题的确切顺序 - 你最好自己阅读GAE pojo序列化ID。

答案 1 :(得分:1)

问题来自您的Web服务器而不是GWT本身。您应该看看您的Web服务器是否支持热部署以及它如何使用它。

更新: 例如,版本 7 之前的 Tomcat 不支持热部署,您必须在每次更新时重新启动服务器,而Tomcat 7支持热部署,您只需重新加载页面即可获得新的模块

答案 2 :(得分:1)

我也遇到过这样的问题。在这种情况下,您应该有一个表保留每个新的上传信息。此外,您还应该有一个异步请求(可能在您的EntryPoint中),以检查您是否有新的上传。

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

这就是我所做的和没有任何问题的工作......