如何知道GWT中的应用版本发生了变化?

时间:2010-08-19 14:30:10

标签: java tomcat gwt upgrade browser-cache

我有一个用例,我的GWT应用程序在客户端浏览器上运行,我停止了我的tomcat并更新了相关的WAR。
我想要发生的是,一旦我加载tomcat,每个现有客户端都将自动重新加载,以便他们使用正确版本的应用程序。

目前我面临两个问题:

  1. 我不知道如何向当前加载的应用程序发出信号,告知它已经过时并且应该重新加载。我想在我的应用程序中以某种方式识别GWT-RPC失败的原因是404,因此它应该重新加载,但我不确定如何识别它。我当然无法在每个GWT-RPC上重新加载,因为服务器可能会无缘无故地停机,并且会在没有问题的情况下在一两秒钟内重新启动。
  2. 由于某种原因,moduleName.nocache.js文件被缓存,所以即使我手动刷新,我也可以在服务器上看到404请求,因为应用正在寻找不存在的资源(以前的版本),一旦我删除已解决的浏览器缓存。有没有人有任何想法为什么这是缓存?在这方面,我没有改变任何服务器设置。
  3. 修改
    1.似乎没有GWT直接这样做的方式所以我决定的是,当一个模块加载它时会收到一个module version,一个Double,如果一个GWT-RPC失败,模块会查询服务器它的当前module version如果不匹配则会重新加载页面。用于查询模块版本的GWT-RPC是常量,并且出于兼容性原因不会更改。这样,即使所有其他GWT-RPC方法都改变了模块,也保证该方法有效 2.由于BalusC的建议,似乎文件只缓存了5-10分钟,这就是为什么我在这个领域看到了非确定性的行为。我已经打开another question关于如何在单个js文件上设置标头,因为我在某处读到它与容器有关而不是GWT。 谢谢,
    以太

3 个答案:

答案 0 :(得分:1)

HTTP不支持推送数据。您需要使用特定于Web服务器的技术。在Tomcat中,那是Comet。然而,这是很多工作。我宁愿建议使用JavaScript / Ajax让客户端以特定的时间间隔轮询版本更改。例如。每隔五分钟左右。如果结果表明版本发生了变化。然后你可以让JavaScript按window.location.reload重新加载页面。

关于您的缓存问题,请验证相关请求文件的响应标头。它应该至少匹配以下标题:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

答案 1 :(得分:0)

当用户启动你的应用程序时,你可以将app-version放在cookie中;如果用户有最新版本,你可以在每次rpc调用时检查cookie,如果没有抛出异常。

答案 2 :(得分:0)

如果您的应用程序经常呼叫服务器,您可以在找不到合适的策略时发出新版本的信号。检查我对此question的答案。