我使用Grails
,Spring
,Java
和Hibernate
开发了一个Web应用程序。
它包含使用Spring Batch
实现的批处理作业。当我在没有多线程的情况下运行作业时,它运行正常。一旦我引入分区(并且每个分区由不同的线程/多线程处理),经过一些处理后,一些线程会陷入无限循环而永远不会回来。
以下是线程卡住时的堆栈跟踪。
java.lang.Thread.State: RUNNABLE
at org.apache.commons.collections.map.AbstractHashedMap.getEntry(AbstractHashedMap.java:440)
at org.apache.commons.collections.map.AbstractReferenceMap.getEntry(AbstractReferenceMap.java:405)
at org.apache.commons.collections.map.AbstractReferenceMap.get(AbstractReferenceMap.java:230)
at org.grails.datastore.mapping.core.AbstractDatastore.getObjectErrors(AbstractDatastore.java:160)
at org.grails.datastore.mapping.core.Datastore$getObjectErrors.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at org.grails.datastore.mapping.core.Datastore$getObjectErrors.call(Unknown Source)
at org.grails.datastore.gorm.GormValidationApi.getErrors(GormValidationApi.groovy:137)
at sun.reflect.GeneratedMethodAccessor580.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1231)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1047)
at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:877)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:793)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:776)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:164)
at org.grails.datastore.gorm.InstanceMethodInvokingClosure.call(GormEnhancer.groovy:257)
at org.codehaus.groovy.runtime.metaclass.ClosureStaticMetaMethod.invoke(ClosureStaticMetaMethod.java:59)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1580)
at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:1140)
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3308)
at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:1152)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod.setupErrorsProperty(AbstractDynamicPersistentMethod.java:100)
这只是线程跟踪的一部分。
此跟踪仅告诉我有关线程卡住的方法。它没有告诉我任何细节和方法是非常大的搜索问题。任何人都可以帮我解决这个问题:
1)看痕迹有什么不对?
2)如何查看更详细的堆栈跟踪?
答案 0 :(得分:1)
我遇到了完全相同的问题。
我使用grails 1.3.7,我的服务将完全卡在无限循环中。
问题是DomainClassGrailsPlugin不是线程安全的
http://jira.grails.org/browse/GRAILS-7861
这是解决问题的补丁
如果你的grails版本< 1.6.3
修补此代码以替换SoftThreadLocalMap.java并重新安装grails应用程序