[rules-users] trouble dynamically changing packages of a rulebase

Charles Binford Charles.Binford at Sun.COM
Tue Oct 7 18:24:29 EDT 2008


I believe I found my issue.  It is related to this bug which was fixed 
in 4.0.5.
http://jira.jboss.com/jira/browse/JBRULES-1329

Under eclipse I was running drools 4.07, but when running  via cli I was 
inadvertently using version 4.0.4 jar files.

cb


Charles Binford wrote:
> I'm using 4.07.
> Sorry for the long winded post but I was trying to give enough 
> background and code snippets to be useful.  The way I'm running data 
> through drools is in a batch mode.  As I've gained more experience I 
> see that my app may be better suited for the stateless mode, but for 
> now I'm still running stateful.  A "batch" consists of:
> - loop on array of objects calling session.insert(a, true); // then I 
> save off the factHandle
> - session.fireAllRules();
> - loop on array of objects calling session.retract(factHandle);
>
> All has worked fine until I attempted to add the ability to 
> dynamically update a rule package.  It worked both under Eclipse, and 
> running just "java -jar myCompiledApp.jar".
> My application has rules split into two parts.  Part A (adm.rules) is 
> static and contains the logic tied directly to the application.  Part 
> B (adm.userrules) is the user half of the rules where the application 
> can be customized to fit the user.
> After adding the logic to dynamically add the user rules all appears 
> to work fine when run in eclipse.  BUT when I run outside of eclipse 
> (i.e. java -jar ....) it doesn't work.  Only part of my static rules 
> fire.
>
> Here is the code snippet that dynamically loads the new package:
>
>        pkg = pMgr.buildDslPackage(rule_str, dsl_def_file);
>        if (userRulesLoaded) {
>            Package pkgA[] = ruleBase.getPackages();
>            for (Package p : pkgA) {
>                System.out.println("LOADED: " + p.getName());
>            }
>            System.out.println("Removing: " + 
> UserXmlRulesToDrls.getUserRulesPackageName());
>            pMgr.removePackage(ruleBase,
>                UserXmlRulesToDrls.getUserRulesPackageName());
>        }
>              System.out.println("Adding: " + pkg.getName());
>        pMgr.addPackage(ruleBase, pkg);
>        pMgr.createSession(ruleBase);          userRulesLoaded = true;
>    }
>
> pMgr.addPackage, createSession, etc. are small wrappers:
>    public void createSession(RuleBase ruleBase) {
>        if (session != null) {
>            session.dispose();
>        }
>        session = ruleBase.newStatefulSession();
>    }
>    public void addPackage(RuleBase ruleBase, Package pkg) throws 
> Exception {
>        ruleBase.addPackage(pkg);
>    }
>
>    public void removePackage(RuleBase ruleBase, String pkgName) {
>        ruleBase.removePackage(pkgName);
>    }
>
>
> Here are a couple of dummy rules I added in an attempt to debug this.  
> These are from the static "adm.rules" package:
> rule "testme"
>    when
>        $ar : ActionArchive();
>    then
>        System.out.println("Archive: " + $ar.getFile().getFullPath());
> end
>
> rule "testme2"
>    when
>        $f : File();
>    then
>        System.out.println("File: " + $f.getFullPath());
> end
>
> I always get the "archive" print (as expected), but never get the 
> "File" print after the first dynamically set of user rules (the first 
> load works, second and subsequent loading of user rules doesn't).  My 
> user rules also have a "when" based on File() and it always works as 
> expected.
>
>
> Last, here is some sample output, running the exact same set of input 
> through each time.  Each set does two things:
> 1. load a set of user rules
> 2. execute a "batch" of a single file
>
> bash-3.2# /usr/jdk/instances/jdk1.6.0/bin/java -jar admDrools.jar
> com.sun.evtl.pe.customerPolicy.adm.rules
> Adding: com.sun.evtl.pe.customerPolicy.adm.userrules
> ArchiveRdy: /zp1/fs2/23kd
> Mask WFC: /zp1/fs2/23kd
> File: /zp1/fs2/23kd
> Archive: /zp1/fs2/23kd      <<< end of first run, all OK
> LOADED: com.sun.evtl.pe.customerPolicy.adm.rules
> LOADED: com.sun.evtl.pe.customerPolicy.adm.userrules
> Removing: com.sun.evtl.pe.customerPolicy.adm.userrules
> Adding: com.sun.evtl.pe.customerPolicy.adm.userrules
> Archive: /zp1/fs2/23kd      <<< end of second run, missing "File", 
> "Mask", and "ArchiveRdy" statements
> LOADED: com.sun.evtl.pe.customerPolicy.adm.rules
> LOADED: com.sun.evtl.pe.customerPolicy.adm.userrules
> Removing: com.sun.evtl.pe.customerPolicy.adm.userrules
> Adding: com.sun.evtl.pe.customerPolicy.adm.userrules
> Archive: /zp1/fs2/23kd    <<< end of third run, again; missing "File", 
> "Mask", and "ArchiveRdy" statements
>
> Charles Binford
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users



More information about the rules-users mailing list