JBOSS:HTTP上次修改的静态文件时间戳,与.war中包含的静态文件不同

时间:2014-02-23 12:14:37

标签: jboss cluster-computing

在调试我们的网络应用程序时,我们发现我们的JBOSS群集返回的.js / .css / etc静态文件的“Last-Modified”时间戳在两个不同的值之间波动 - 这也是我们JBOSS集群中的节点数量(我们有两台机器,每台机器在集​​群节点配置中运行JBOSS实例)。然后我们验证了每个JBOSS节点确实提供了不同的时间戳(对于特定的请求资源,例如/some/resource.js),这不是 APPNAME.war中存在的文件的修改时间戳

进一步搜索显示,当我们的.ear的新版本部署到群集时,两个JBOSS实例在自动命名的文件夹中解压缩它(例如... / deployment4670b6dc3fccdb52 / APPNAME-war-885ea865da6056a5 /)。在这些文件夹中,我们检查并验证它是用于“Last-Modified”HTTP标头响应的新未压缩文件的修改时间戳,并且这些时间戳确实不是包含在其中的实际修改时间戳。的.war 即可。事实上,看起来JBOSS在解压缩这些文件时正在使用部署时间 - 这意味着它使用“.war解压缩期间的当前时间”,并且每个JBOSS实例最终都有自己的时间戳本地“版本”。

反过来意味着, JBOSS群集为客户端提供了不同的“Last-Modified”时间戳,用于静态资源,具体取决于JBOSS集群IP转发它们的服务器!由于我们的群集是基于循环配置的,这意味着我们客户的浏览器可以看到如下所示的“Last-Modified”标头:

  1. GET /some/resource.js
  2. 返回HTTP“Last-Modified”标头,例如: JBOSS实例A,值T1
  3. ....
  4. GET /some/resource.js
  5. 返回HTTP“Last-Modified”标头,例如: JBOSS实例B,值T2
  6. ....
  7. GET /some/resource.js
  8. 返回HTTP“Last-Modified”标头,例如: JBOSS实例A,值T1
  9. ... T1和T2有两个完全不同的时间戳(.war在两个簇节点中的每个节点都未压缩的时间)。

    最后,这似乎完全弄乱了浏览器的缓存簿记。更具体地说,浏览器最终会重新下载内容 - 这确实非常浪费。

    为什么JBOSS不使用.ear中包含的时间戳而是使用“deploy-decompression-time”?我验证了使用“jar xvf”从.ear中提取.war,再次在.war上提取“jar xvf”,时间戳是正确的(机器中的时间戳正在进行构建)。时间戳信息就在.ear / .war中 - 它似乎被JBOSS忽略了。

    到目前为止我们使用的解决方法是停止群集中的两个节点之一,从而强制“一致”时间戳(错误的时间,请注意 - 因为它们是仍在运行的节点的“部署时间” - 但至少它们在对同一资源的重复HTTP请求中保持一致。

    欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

原来这是JBOSS EAP 6.0中的一个错误,已在以后的版本中修复。