[rules-dev] Can't execute rules twice with a second classloader

Aaron Dixon atdixon at gmail.com
Sat Jul 14 15:57:11 EDT 2007


Created issue:

http://jira.jboss.com/jira/browse/JBRULES-1009


On 7/14/07, Mark Proctor <mproctor at codehaus.org> wrote:
> we have jira, create one there.
>
> The idea with the cache is to avoid duplicating getter generation, in
> normal environments this is fine and preferred - with class code
> generation for facts this is a problem. After 4.0 we can look into
> having the cache scoped depending on your use case.
>
> Mark
> Aaron Dixon wrote:
> > This is exactly right. My only question is why the internal Drools
> > cache isn't scoped to the RuleBase or the session -- why is it scoped
> > to the VM...is it a static cache? If time permits I can try to look
> > into this, not sure how soon I could get to it , though. Is there an
> > issue in your bug tracking system for this?
> >
> > On 7/14/07, Mark Proctor <mproctor at codehaus.org> wrote:
> >>
> >>  I think this is related to  this:
> >>          FooClassLoader loader1 = new FooClassLoader(original);
> >>          Class instance1 = loader1.loadClass(
> >> "test.drools.classloader.Foo"
> >> );
> >>          FooClassLoader loader2 = new FooClassLoader(original);
> >>          Class instance2 = loader2.loadClass(
> >> "test.drools.classloader.Foo"
> >> );
> >>          System.out.println( instance1.isAssignableFrom( instance2 ) );
> >>
> >>  Notice the instances are not assignable. We generate bytecode field
> >> readers, and cache them by string name. Now I imagine the second
> >> instance is
> >> using that same cache with the code generated off the first
> >> classloader, and
> >> thus providing the error. I'm not sure how to fix this.... expect it's a
> >> point release fix now - patch welcome :)
> >>
> >>  Mark
> >>
> >>  Aaron Dixon wrote:
> >> Here you go. It's an eclipse project. Only dependencies are the Drools
> >>  4 deps. You'll see clearly in .classpath -- Run "Driver". Let me know
> >>  if you have problems.
> >>
> >>  On 7/13/07, Mark Proctor <mproctor at codehaus.org> wrote:
> >>
> >> can you make an integration test for us? As we'll need to be easily able
> >>  to reproduce this. We'll add it to our code base and fix. We'll
> >> probably
> >>  add it as aprt of the MiscTest class:
> >> http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
> >>
> >>
> >>
> >>  Aaron Dixon wrote:
> >>  > I am trying to sequentially perform two rules executions using two
> >>  > different classloaders in the same VM. I create completely new state
> >>  > for each execution, yet I still fail on the second execution. I
> >>  > believe this has to do with some internal static cached state that
> >>  > JBossRules is maintaining. A snippet of the code and exeception are
> >>  > shown in this email.
> >>  >
> >>  >    public void demo() throws Exception {
> >>  >        // Save original classloader
> >>  >        ClassLoader original =
> >>  > Thread.currentThread().getContextClassLoader();
> >>  >
> >>  >        // Create Classloader 1 with parent of original
> >>  >        FooClassLoader loader1 = new FooClassLoader(original);
> >>  >
> >> Thread.currentThread().setContextClassLoader(loader1);
> >>  >        testRules();
> >>  >
> >>  >        // Success so far...
> >>  >
> >>  >        // Create Classloader 2 with parent of original
> >>  >        FooClassLoader loader2 = new FooClassLoader(original);
> >>  >
> >> Thread.currentThread().setContextClassLoader(loader2);
> >>  >        testRules();
> >>  >
> >>  >        // Never make it to here.
> >>  >
> >>  >        // Restore
> >>  >
> >> Thread.currentThread().setContextClassLoader(original);
> >>  >    }
> >>  >
> >>  >    private void testRules() throws Exception {
> >>  >        PackageBuilder builder = new PackageBuilder();
> >>  >        Package pkg = buildPackage(new String[] { "Foo.drl" },
> >> builder);
> >>  >        RuleBase base = RuleBaseFactory.newRuleBase();
> >>  >        base.addPackage(pkg);
> >>  >        StatelessSession session = base.newStatelessSession();
> >>  >        final ClassLoader loader =
> >>  > Thread.currentThread().getContextClassLoader();
> >>  >        Object inst = loader.loadClass("com.foo.Foo").newInstance();
> >>  >        session.execute(new Object[] { inst });
> >>  >    }
> >>  >
> >>  >
> >>  >
> >>  > Exception in thread "main" java.lang.ClassCastException:
> >>  >
> >> adixon.prototype.rules.classloader.demo.copy.FooShadowProxy
> >>  >     at
> >>  >
> >> org.drools.base.adixon.prototype.rules.classloader.demo.copy.Foo$getName.getValue(Unknown
> >>
> >>  >
> >>  > Source)
> >>  >     at
> >>  >
> >> org.drools.base.ClassFieldExtractor.getValue(ClassFieldExtractor.java:94)
> >>
> >>  >     at
> >>  >
> >> org.drools.base.evaluators.StringFactory$StringEqualEvaluator.evaluate(StringFactory.java:85)
> >>
> >>  >
> >>  >     at
> >>  >
> >> org.drools.rule.LiteralRestriction.isAllowed(LiteralRestriction.java:61)
> >>  >     at
> >>  >
> >> org.drools.rule.LiteralConstraint.isAllowed(LiteralConstraint.java:82)
> >>  >     at
> >> org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:121)
> >>  >     at
> >>  >
> >> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:20)
> >>
> >>  >
> >>  >     at
> >>  >
> >> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:159)
> >>  >     at
> >> org.drools.reteoo.Rete.assertObject(Rete.java:175)
> >>  >     at
> >>  >
> >> org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:190)
> >>  >     at
> >>  >
> >> org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:70)
> >>
> >>  >
> >>  >     at
> >>  >
> >> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:772)
> >>
> >>  >
> >>  >     at
> >>  >
> >> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:584)
> >>
> >>  >
> >>  >     at
> >>  >
> >> org.drools.reteoo.ReteooStatelessSession.execute(ReteooStatelessSession.java:63)
> >>
> >>  >
> >>  >     at
> >>  >
> >> adixon.prototype.rules.classloader.demo.copy.Driver.testRules(Driver.java:47)
> >>
> >>  >
> >>  >     at
> >>  >
> >> adixon.prototype.rules.classloader.demo.copy.Driver.go(Driver.java:33)
> >>  >     at
> >>  >
> >> adixon.prototype.rules.classloader.demo.copy.Driver.main(Driver.java:17)
> >>  > _______________________________________________
> >>  > rules-dev mailing list
> >>  > rules-dev at lists.jboss.org
> >>  > https://lists.jboss.org/mailman/listinfo/rules-dev
> >>  >
> >>
> >>  _______________________________________________
> >>  rules-dev mailing list
> >>  rules-dev at lists.jboss.org
> >>  https://lists.jboss.org/mailman/listinfo/rules-dev
> >>
> >>  ________________________________
> >>
> >> _______________________________________________
> >> rules-dev mailing list
> >> rules-dev at lists.jboss.org
> >> https://lists.jboss.org/mailman/listinfo/rules-dev
> >>
> >>
> >>
> >> _______________________________________________
> >> rules-dev mailing list
> >> rules-dev at lists.jboss.org
> >> https://lists.jboss.org/mailman/listinfo/rules-dev
> >>
> >>
> > _______________________________________________
> > rules-dev mailing list
> > rules-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-dev
> >
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>



More information about the rules-dev mailing list