Multithreading Spring批处理多线程抛出java.lang.Thread.State

Multithreading Spring批处理多线程抛出java.lang.Thread.State,multithreading,spring,hibernate,grails,gorm,Multithreading,Spring,Hibernate,Grails,Gorm,我使用Grails、Spring、Java和Hibernate开发了一个web应用程序 它包含使用Spring batch实现的批处理作业。当我在没有多线程的情况下运行作业时,它工作得很好。一旦我引入了分区(每个分区都由不同的线程/多线程处理),在一些处理之后,一些线程就会陷入无限循环中,永远不会回来 下面是线程卡住时的堆栈跟踪 java.lang.Thread.State: RUNNABLE at org.apache.commons.collections.map.AbstractHashe

我使用
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) 如何查看更详细的堆栈跟踪

我遇到了完全相同的问题

我使用Grails1.3.7,我的服务将完全陷入无限循环

问题是DomainClassGrailsPlugin不是线程安全的

这是解决您的问题的补丁

如果您的grails版本<1.6.3


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

我遇到了完全相同的问题

我使用Grails1.3.7,我的服务将完全陷入无限循环

问题是DomainClassGrailsPlugin不是线程安全的

这是解决您的问题的补丁

如果您的grails版本<1.6.3


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

如果没有更多信息,很难说出确切的问题。根据导致问题的多线程行为,猜测在数据库级别或代码内部是否存在某种类型的争用。可能会检查数据库是否存在争用。另一个想法是下载apache commons collections映射源代码并设置断点,或者尝试在线程冻结时查看到底尝试了什么。如果没有更多信息,很难说出确切的问题。根据导致问题的多线程行为,猜测在数据库级别或代码内部是否存在某种类型的争用。可能会检查数据库是否存在争用。另一个想法是下载ApacheCommons集合映射源代码并设置断点,或者尝试在线程冻结时查看到底尝试了什么。谢谢您的回答。我正在使用Grails2.0.3。这个问题似乎已经在2.0.3中解决了。我不知道为什么我的线程仍然在无限循环中运行。你的回答对发现这个问题很有帮助。谢谢,我建议您使用jconsole来检查cpu是否总是等于100%(对于一个cpu核心),检查这是否是一个无限循环问题。您的回答非常有用,正如您在回答中提到的,问题出现在grails数据存储核心文件中。SoftThreadLocalMap.java文件不是线程安全的。他们已经在grails datastore core version>2中修复了这个问题。谢谢你的帮助。谢谢你的回答。我正在使用Grails2.0.3。这个问题似乎已经在2.0.3中解决了。我不知道为什么我的线程仍然在无限循环中运行。你的回答对发现这个问题很有帮助。谢谢,我建议您使用jconsole来检查cpu是否总是等于100%(对于一个cpu核心),检查这是否是一个无限循环问题。您的回答非常有用,正如您在回答中提到的,问题出现在grails数据存储核心文件中。SoftThreadLocalMap.java文件不是线程安全的。他们已经在grails datastore core version>2中修复了这个问题。谢谢你的帮助。