1

我有一个使用GrailsSpring和.JavaHibernate

它包含一个使用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)如何查看更详细的堆栈跟踪?

4

1 回答 1

1

我遇到了完全相同的问题。

我使用 grails 1.3.7,我的服务将完全陷入无限循环。

问题是 DomainClassGrailsPlugin 不是线程安全的

http://jira.grails.org/browse/GRAILS-7861

这是解决您问题的补丁

如果您的 grails 版本 < 1.6.3

修补此代码以替换 SoftThreadLocalMap.java 并重新安装 grails 应用程序

于 2013-05-24T06:01:15.190 回答