Tomcat 上的 Grails 应用在部署几天后忘记了时区

Grails app on Tomcat forgets timezone a few days after deployment

我正在 运行CentOS 服务器上安装一个大型 Grails 应用程序。

服务器设置为美国东部时间 (GMT - 5)。

当我部署应用程序(作为 war 文件)时,应用程序的日期和时间将在几天内是正确的,然后应用程序突然变得混乱并认为它是格林威治标准时间,而不是美国东部标准时间.

这会导致域对象上的日期不正确,还会导致 Quartz 作业在错误的时间 运行。例如:

当前 运行宁 Grails 版本 2.4.4、Apache Tomcat/8.0.15、OpenJDK 1.8.0,但我们在各种 2.3.x 版本的 grails 上遇到了相同的行为, Tomcat 7, 和 Java 7.

我仍然不确定这是 Grails 问题还是 Tomcat 问题。任何解决问题的想法都将不胜感激。

事实证明,问题出在代码中某处使用了 TimeZone.setDefault()

在应用程序的任何地方像这样修改全局状态是极其危险的!

即使在代码中使用,乍一看 "protected" 像这样 old = current(); set(new); dostuff(); set(old),也可能会中断(但更难捕捉),因为它会进行短暂的更改时间段和它周围的错误变得更加模糊。例外将完成剩下的工作...