2

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

目前我面临两个问题:

  1. 我不知道如何向当前加载的应用程序发出信号,表明它已过时并且应该重新加载。我正在考虑以某种方式在我的应用程序中确定 GWT-RPC 失败的原因是 404,因此它应该重新加载,但我不确定如何确定这一点。当然,我不能在每个 GWT-RPC 上重新加载,因为服务器可能会无缘无故地关闭,并且会在一两秒内备份而不会出现问题。
  2. 出于某种原因,moduleName.nocache.js 文件被缓存,所以即使我手动刷新我也可以在服务器上看到 404 请求,因为应用程序正在寻找不存在的资源(以前的版本),一旦我删除缓存浏览器解决了这个问题。有谁知道为什么要缓存它?在这方面,我对服务器设置没有任何改变。

编辑:
1. 似乎没有 GWT 直接的方法可以做到这一点,所以我决定当一个模块加载时,它会收到一个module version,一个 Double,如果 GWT-RPC 失败,模块会向服务器查询其当前module version和如果不匹配,它会重新加载页面。用于查询模块版本的 GWT-RPC 是恒定的,不会出于兼容性原因而更改。这样,即使所有其他 GWT-RPC 方法更改了模块,也可以保证此方法有效。
2. 多亏了 BalusC 的建议,该文件似乎只缓存了 5-10 分钟,这就是为什么我一直在该区域看到非确定性行为。我打开了另一个问题关于如何在单个 js 文件上设置标头,因为我在某处读到它与容器相关而不是与 GWT 相关。谢谢,
伊泰

4

3 回答 3

1

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

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

缓存控制:无缓存、无存储、必须重新验证
Pragma:无缓存
过期:0
于 2010-08-19T14:49:49.297 回答
0

您可以在用户启动您的应用程序时将您的应用程序版本放入 cookie 中,并且在每次 rpc 调用时检查 cookie 用户是否拥有最新版本,如果没有则抛出异常。

于 2010-08-19T17:59:53.437 回答
0

如果您的应用程序频繁调用服务器,您可以在找不到正确策略时发出新版本信号。检查我对这个问题的回答。

于 2012-08-25T05:18:54.077 回答