0

Groovy 1.7.8 を使用しています。異なるドメイン オブジェクトで同時に実行する Groovy DSL を作成しました。

最近、DSL が同時にコンパイル/実行されているときに、大量の並行性の下でデッドロックに直面し始めました。

以下を使用して、実行時にGroovy DSLをコンパイル/実行しています:

Script s = compileScript(dsl)
def binding = new Binding()
binding.setVariable("domainObj", domainObj)
s.setBinding(binding)
s.run() 

def Script compileScript(String dsl) {
    def scriptText = getScriptText(dsl)
    def conf = new CompilerConfiguration()
    conf.setScriptBaseClass(GroovyViewExecutionBase.class.getName())
    new GroovyShell(conf).parse(scriptText)
}

以下はデッドロックされたスレッドのスレッド ダンプです。スレッド ダンプを見ると、実行時にスクリプトを同時にコンパイル/実行すると、Groovy が内部でデッドロックしているように感じます。

デッドロック-参加者-1:

at java.beans.PropertyDescriptor.getReadMethod(PropertyDescriptor.java:158)

- waiting to lock <0x00007f41a3363960> (a java.beans.PropertyDescriptor)

at java.beans.Introspector.processPropertyDescriptors(Introspector.java:683)

at java.beans.Introspector.getTargetPropertyInfo(Introspector.java:615)

at java.beans.Introspector.getBeanInfo(Introspector.java:407)

at java.beans.Introspector.getBeanInfo(Introspector.java:164)

- locked <0x00007f41a3358c28> (a java.lang.Object)

at groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:2940)

at java.security.AccessController.doPrivileged(Native Method)

at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:2938)

at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:2921)

- locked <0x00007f429f011268> (a groovy.lang.ExpandoMetaClass)

at groovy.lang.ExpandoMetaClass.initialize(ExpandoMetaClass.java:463)

- locked <0x00007f429f011268> (a groovy.lang.ExpandoMetaClass)

at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:166)

at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:182)

at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:210)

at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:751)

at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:32)

at groovy.lang.Script.<init>(Script.java:40)

at groovy.lang.Script.<init>(Script.java:37)

at flipkart.cms.views.core.GroovyViewExecutionBase.<init>(GroovyViewExecutionBase.groovy)

at Script1.<init>(Script1.groovy)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at java.lang.Class.newInstance0(Class.java:355)

at java.lang.Class.newInstance(Class.java:308)

at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:408)

at groovy.lang.GroovyShell.parse(GroovyShell.java:743)

at groovy.lang.GroovyShell.parse(GroovyShell.java:770)

at groovy.lang.GroovyShell.parse(GroovyShell.java:761)

at groovy.lang.GroovyShell$parse.call(Unknown Source)

at cms.views.core.GroovyDSLViewComputer.compileScript(GroovyDSLViewComputer.groovy:85)

==================

Deadlock-Participant-2: java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1277) で

- waiting to lock <0x00007f41a3358c28> (a java.lang.Object)

at java.beans.Introspector.internalFindMethod(Introspector.java:1312)

at java.beans.Introspector.findMethod(Introspector.java:1383)

at java.beans.Introspector.findMethod(Introspector.java:1363)

at java.beans.PropertyDescriptor.getReadMethod(PropertyDescriptor.java:179)

- locked <0x00007f41a3363960> (a java.beans.PropertyDescriptor)

at groovy.lang.MetaClassImpl.applyPropertyDescriptors(MetaClassImpl.java:2215)

at groovy.lang.MetaClassImpl.setupProperties(MetaClassImpl.java:1995)

at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:2950)

at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:2921)

- locked <0x00007f42a12972b8> (a groovy.lang.ExpandoMetaClass)

at groovy.lang.ExpandoMetaClass.initialize(ExpandoMetaClass.java:463)

- locked <0x00007f42a12972b8> (a groovy.lang.ExpandoMetaClass)

at org.codehaus.groovy.runtime.HandleMetaClass.replaceDelegate(HandleMetaClass.java:66)

at org.codehaus.groovy.runtime.HandleMetaClass.setProperty(HandleMetaClass.java:91)

at org.codehaus.groovy.runtime.InvokerHelper.setProperty(InvokerHelper.java:179)

at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.setProperty(ScriptBytecodeAdapter.java:483)

at flipkart.cms.views.core.GroovyViewExecutionBase.setupAttrProperties(GroovyViewExecutionBase.groovy:60)

at flipkart.cms.views.core.GroovyViewExecutionBase$setupAttrProperties$0.callCurrent(Unknown Source)

at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)

at cms.views.core.GroovyViewExecutionBase.computeView(GroovyViewExecutionBase.groovy:32)

==================

これを修正/回避する方法はありますか?

4

1 に答える 1

1

これを groovy-user フォーラムに投稿すると、明らかに Java 7 で修正された Java 6 の java.beans.Introspector クラスの同期の問題が原因でデッドロックが発生しているように見えます。また、Java 6 用のこれらのクラスのバックポートを受け取り、デッドロックを再現するためにバックポートされたクラス。

詳細はこちら:

http://groovy.329449.n5.nabble.com/Groovy-deadlocks-when-executing-DSL-from-GroovyShell-td5709889.html

于 2012-05-31T10:12:36.773 に答える