1

GrailsSpringJavaおよびを使用して開発した Web アプリケーションがありHibernateます。

を使用して実装されたバッチ ジョブが含まれています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 に答える