Tomcat 上的 Grails 应用在部署几天后忘记了时区
Grails app on Tomcat forgets timezone a few days after deployment
我正在 运行CentOS 服务器上安装一个大型 Grails 应用程序。
服务器设置为美国东部时间 (GMT - 5)。
当我部署应用程序(作为 war 文件)时,应用程序的日期和时间将在几天内是正确的,然后应用程序突然变得混乱并认为它是格林威治标准时间,而不是美国东部标准时间.
这会导致域对象上的日期不正确,还会导致 Quartz 作业在错误的时间 运行。例如:
我们有一份工作,每天 运行 在美国东部标准时间 6:15AM 发送报告
电子邮件。这发生在几天后的正确时间
部署,然后日常工作突然在 运行ning 1:15AM 开始
相反。
与 g:formatDate 一起显示的日期字段将改为显示 GMT
EST 但日期本身的小时/分钟/秒不
更改,所以每次保存记录时,日期最终都是
推了ward 五个小时。
当前 运行宁 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)
,也可能会中断(但更难捕捉),因为它会进行短暂的更改时间段和它周围的错误变得更加模糊。例外将完成剩下的工作...
我正在 运行CentOS 服务器上安装一个大型 Grails 应用程序。
服务器设置为美国东部时间 (GMT - 5)。
当我部署应用程序(作为 war 文件)时,应用程序的日期和时间将在几天内是正确的,然后应用程序突然变得混乱并认为它是格林威治标准时间,而不是美国东部标准时间.
这会导致域对象上的日期不正确,还会导致 Quartz 作业在错误的时间 运行。例如:
我们有一份工作,每天 运行 在美国东部标准时间 6:15AM 发送报告 电子邮件。这发生在几天后的正确时间 部署,然后日常工作突然在 运行ning 1:15AM 开始 相反。
与 g:formatDate 一起显示的日期字段将改为显示 GMT EST 但日期本身的小时/分钟/秒不 更改,所以每次保存记录时,日期最终都是 推了ward 五个小时。
当前 运行宁 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)
,也可能会中断(但更难捕捉),因为它会进行短暂的更改时间段和它周围的错误变得更加模糊。例外将完成剩下的工作...