服务器一夜之间闲置后的GSP渲染问题

时间:2012-06-01 00:41:12

标签: tomcat grails tomcat7 gsp

我几周来一直在间歇性地遇到难以复制的问题。似乎(即我还不能确定)如果一夜之间没有触及Grails应用程序,可能会卸载某些内容导致:

使用以下值呈现的GSP:

<meta http-equiv="org.apache.commons.lang.StringUtils@72cd722b" content="org.apache.commons.lang.StringUtils@4e520b18">

<link href="/appname/static/bundle-bundle_application_head.css" type="org.apache.commons.lang.StringUtils@31da0262" rel="org.apache.commons.lang.StringUtils@774121fe" media="org.apache.commons.lang.StringUtils@6008482c" />

<body style="org.apache.commons.lang.StringUtils@49533701">

<a href="/appname/register/forgotPassword" name="org.apache.commons.lang.StringUtils@815a651" class="org.apache.commons.lang.StringUtils@5689bde">Forgotten Password?</a>

这种情况发生在Tomcat独立部署,并且一旦让Grails在IntelliJ中一夜之间运行。

这种情况不是每晚都会发生,而是在大多数情况下,我无法追踪工作与不工作之间的区别。

应用程序或Tomcat的日志中没有任何内容可以提供线索。

此时我想知道是否与资源插件有关。但任何关于看什么的想法都值得赞赏

环境:

   OS Win7 x64 and Redhat 5
Tomcat 7.0.x (also was occuring on latest Glassfish)
Grails 2.0.4
Plugins: 
plugins.cache=1.0.0.RC1
plugins.cache-headers=1.1.5
plugins.compress=0.4
plugins.console=1.1
plugins.executor=0.3
plugins.export=1.3
plugins.fields=1.1
plugins.google-visualization=0.5.2
plugins.grails-melody=1.13
plugins.joda-time=1.4
plugins.mail=1.0
plugins.p6spy=0.5
plugins.quartz-monitor=0.2
plugins.spring-security-core=1.2.7.3
plugins.springcache=1.3.1
plugins.zipped-resources=1.0

更新#1:

本周末再次发现,在使用Tomcat管理器重新加载webapp时,它失败并显示以下消息但这不会在Tomcat的新开始时发生

 INFO: Initializing Spring root WebApplicationContext
Jun 3, 2012 7:53:01 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ExceptionInInitializerError
    at java.lang.Class.forName(Class.java:247)
    ... 3 more
Caused by: groovy.lang.MissingMethodException: No signature of method: static org.joda.time.DurationFieldType.hour() is applicable for argument types: () values: []
Possible solutions: hours(), wait(), days(), eras(), years(), any()
    at grails.plugin.jodatime.taglib.PeriodTagLib$_getPeriodTypeForFields_closure3.doCall(PeriodTagLib.groovy:87)
    at grails.plugin.jodatime.taglib.PeriodTagLib.getPeriodTypeForFields(PeriodTagLib.groovy:87)
    at grails.plugin.jodatime.taglib.PeriodTagLib.<clinit>(PeriodTagLib.groovy:84)
    ... 4 more

我不相信,因为jodaTime插件中的代码看起来不错:

   Line 84: private static final PeriodType DEFAULT_PERIOD_TYPE = getPeriodTypeForFields("hours,minutes,seconds")

    private static PeriodType getPeriodTypeForFields(String fields) {
    Line 87:    def fieldTypes = fields.split(/\s*,\s*/).collect { DurationFieldType."$it"() } as DurationFieldType[]

更新#2

Melody表明慢慢地所有的物理内存都被吞噬了

如果重新加载应用程序,可能与这些日志条目有关(并且总是强制关闭Tomcat并从挂起的java进程开始被杀死)

SEVERE: The web application [/appname] appears to have started a thread named [Timer-1] but has failed to stop it. This is very likely to create a memory leak.
May 31, 2012 6:04:51 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/appname] appears to have started a thread named [DefaultQuartzScheduler_Worker-1] but has failed to stop it. This is very likely to create a memory leak.
May 31, 2012 6:04:51 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

或者它是这样的:http://wiki.apache.org/tomcat/MemoryLeakProtection#cclThreadSpawnedByCommonClassLoader

更新#3

物理内存问题已解决且应用仍然损坏,看起来像原始发布。此次闲置后(几个小时)

2 个答案:

答案 0 :(得分:1)

问题是在Bootstrap.groovy中有这一行:

String.metaClass.mixin StringUtils

我最终删除了这个并且在通常导致问题的所有条件下已经测试了超过24小时。

我很久以前就从这里发帖了:Groovy GDK equivalent of Apache Commons StringUtils.capitalize(str) or Perl's ucfirst(str)

错误和代码之间有一些关系,但是说实话,我仍然真的不知道混合中发生了什么事情随着时间的推移... ...回到书中我。

答案 1 :(得分:0)

怪异。不幸的是,我也遇到了这个问题,但关于原因的信息很少;我能提供的最好的是它没有发生在Grails 1.1上,确实发生在Grails 2.2.0中,并且已经被归档为http://jira.grails.org/browse/GRAILS-10462