EAR containing SwitchYard jars sometimes fails during deployment when the application has a dependency on "org.overlord.rtgov"

Solution Verified - Updated -

Issue

  • Sometimes users get this exception when deploying an EAR application (at server start-up) that contains multiple SwitchYard jars containing a lot of Drools rule files (drl) .
12:52:29,600 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.deployment.subunit."simple.ear"."backendswitchyard-0.0.1-SNAPSHOT.jar".SwitchYardService: org.jboss.msc.service.StartException in service jboss.deployment.subunit."simple.ear"."backendswitchyard-0.0.1-SNAPSHOT.jar".SwitchYardService: [Error: ASMAccessorImpl_16291840971449834749560 cannot be cast to org.mvel2.compiler.Accessor]
[Near : {... @declare{"returnValueMethod"} ....}]
             ^
[Line: 1, Column: 1]
    at org.switchyard.as7.extension.services.SwitchYardService.start(SwitchYardService.java:89)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_72]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_72]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_72]
Caused by: [Error: ASMAccessorImpl_16291840971449834749560 cannot be cast to org.mvel2.compiler.Accessor]
[Near : {... @declare{"returnValueMethod"} ....}]
             ^
[Line: 1, Column: 1]
    at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:883)
    at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.optimizeAccessor(ASMAccessorOptimizer.java:243)
    at org.mvel2.optimizers.dynamic.DynamicGetAccessor.optimize(DynamicGetAccessor.java:90)
    at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:64)
    at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
    at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42)
    at org.mvel2.MVEL.executeExpression(MVEL.java:930)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:45)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledForEachNode.eval(CompiledForEachNode.java:114)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.TerminalNode.eval(TerminalNode.java:35)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledIfNode.eval(CompiledIfNode.java:44)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:285)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:247)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:255)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:207)
    at org.drools.compiler.rule.builder.dialect.java.JavaRuleBuilderHelper.generateMethodTemplate(JavaRuleBuilderHelper.java:226)
    at org.drools.compiler.rule.builder.dialect.asm.AbstractASMConsequenceBuilder.build(AbstractASMConsequenceBuilder.java:24)
    at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:109)
    at org.drools.compiler.compiler.PackageBuilder.addRule(PackageBuilder.java:3326)
    at org.drools.compiler.compiler.PackageBuilder.compileRules(PackageBuilder.java:1076)
    at org.drools.compiler.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:965)
    at org.drools.compiler.compiler.CompositeKnowledgeBuilderImpl.buildRules(CompositeKnowledgeBuilderImpl.java:266)
    at org.drools.compiler.compiler.CompositeKnowledgeBuilderImpl.buildPackages(CompositeKnowledgeBuilderImpl.java:98)
    at org.drools.compiler.compiler.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:87)
    at org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:204)
    at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:39)
    at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:309)
    at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:187)
    at org.switchyard.component.common.knowledge.session.KnowledgeBuilderSessionFactory.newBase(KnowledgeBuilderSessionFactory.java:125)
    at org.switchyard.component.common.knowledge.session.KnowledgeBuilderSessionFactory.<init>(KnowledgeBuilderSessionFactory.java:71)
    at org.switchyard.component.common.knowledge.session.KnowledgeSessionFactory.newSessionFactory(KnowledgeSessionFactory.java:117)
    at org.switchyard.component.common.knowledge.exchange.KnowledgeExchangeHandler.doStart(KnowledgeExchangeHandler.java:204)
    at org.switchyard.deploy.BaseServiceHandler.start(BaseServiceHandler.java:60)
    at org.switchyard.deploy.internal.Deployment.deployImplementations(Deployment.java:574)
    at org.switchyard.deploy.internal.Deployment.start(Deployment.java:144)
    at org.switchyard.as7.extension.deployment.SwitchYardDeployment.start(SwitchYardDeployment.java:127)
    at org.switchyard.as7.extension.services.SwitchYardService.start(SwitchYardService.java:78)
    ... 5 more
Caused by: java.lang.ClassCastException: ASMAccessorImpl_16291840971449834749560 cannot be cast to org.mvel2.compiler.Accessor
    at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer._initializeAccessor(ASMAccessorOptimizer.java:745)
    at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:859)
    ... 51 more

As this error occurs only sometimes and for different modules it looks like a race condition on the ASM optimization of MVEL expressions. Initial analysis showed that the problem occurs, because the Accessor is loaded by two different class loaders and especially through two different modules like the following shipped with FSW 6.0.0 installation.

Module Name        : Internally Dependent Module Name
-------------------------------------------------------
org.drools         : org.mvel
org.overlord.rtgov : org.mvel.mvel2

Users application inherits the first module dependency (i.e. org.drools) through the usage of the SwitchYard Rules Component. The second module dependency is introduced, as the EAR application has a dependency on this module org.overlord.rtgov.

  • What is the root cause behind this issue and how to fix it?

Environment

  • Red Hat JBoss Fuse Service Works (FSW)
    • 6.0.0

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content