2014年5月19日星期一

EAP_004:修改系统时间后导致AJAX工作不正常的问题

环境:RHEL 6.3 + JBoss EAP 6.1

问题现象如下:
用户使用命令:date -s "2013-08-03 14:15:00",把RHEL系统时间调前了。
重新启动JBoss,访问应用,发现很多按钮和过滤功能都不正常了。
使用Firefox Debug发现,工作不正常的功能都是与AJAX有关的,POST过去的参数都莫名的丢掉了。

一度怀疑是因为源码文件时间比系统时间新,于是导致页面中的组件不断被刷新。
于是使用命令:find ./ -name "*.xhtml" -exec touch {} \; 更新所有源代码文件的时间。
但是问题依旧。

最后,终于从不起眼的日志中看到如下信息:
INFO [facelets.facelet] (http-localhost/127.0.0.1:8080-1) Facelet[/META-INF/template/datatable.xhtml] was modified @ 5:42:46, flushing component applied @ 5:42:45

原来问题还是出在Facelets视图处理框架上!
每次HTTP请求时,Facelets会检查xhtml的修改时间,与系统时间对比,如果页面代码时间新,则Facelets重新更新xhtml视图。
如果JSF组件树上有状态,也都会被一并flush,就会导致应用上页面功能不正常。

那么,是哪些xhtml文件比系统时间新呢?因为已经用touch命令都修改过了呀。
原来问题出现在jar包中的xhtml页面,它们的时间没有改过来,比系统时间新。
虽然jar包的修改时间改过来了,但里面的xhtml,JBoss EAP在解压加载时读到的还是最新的时间(比系统时间新)。

问题清楚了,解决方法也就有了:

方法1. 把jar里的xhtml页面修改成系统当前时间。

方法2. 在web.xml中,修改Facelets配置,禁用检查xhtml的修改时间功能,具体如下:
    <context-param>
      <param-name>facelets.REFRESH_PERIOD</param-name>
      <param-value>-1</param-value>
   </context-param>

没有评论: