[rules-users] Out Of Memory with static Rulebase

James Williams james.williajd at gmail.com
Mon Feb 15 18:51:42 EST 2010


Hi,

I hope someone can help me with this.

I are running Drools 5.0.0.CR1 using JANINO to compile a spreadsheet  
into rules. I have lots of tests that prove the compilation is working  
properly and the rules are correct.

Every now and then (twice in two months) we have had the following  
exception start appearing and the rules stop working at all. The error  
occurs after the system has been running for a while and at a point in  
the application that has been visited many many times before the error  
appears.

Caused by: java.lang.OutOfMemoryError
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
java.util.zip.ZipFile.open(Native Method)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
java.util.zip.ZipFile.<init>(ZipFile.java:203)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
java.util.jar.JarFile.<init>(JarFile.java:132)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
java.util.jar.JarFile.<init>(JarFile.java:97)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org 
.apache 
.catalina.loader.WebappClassLoader.openJARs(WebappClassLoader.java:1724)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org 
.apache 
.catalina 
.loader.WebappClassLoader.findResources(WebappClassLoader.java:991)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
java.lang.ClassLoader.getResources(ClassLoader.java:1015)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org.drools.util.ChainedProperties.getResources(ChainedProperties.java: 
155)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org.drools.util.ChainedProperties.<init>(ChainedProperties.java:79)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org.drools.util.ChainedProperties.<init>(ChainedProperties.java:41)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org.drools.util.ChainedProperties.<init>(ChainedProperties.java:35)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org.drools.SessionConfiguration.init(SessionConfiguration.java:112)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org.drools.SessionConfiguration.<init>(SessionConfiguration.java:106)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org 
.drools 
.reteoo 
.ReteooStatelessSession.newWorkingMemory(ReteooStatelessSession.java:86)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
org 
.drools 
.reteoo.ReteooStatelessSession.execute(ReteooStatelessSession.java:185)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
com 
.base2 
.ecm.just.service.product.LocalRulesEngine.apply(LocalRulesEngine.java: 
49)
2010-02-16 02:28:38,143 ERROR [STDERR] 	at  
com 
.base2 
.ecm 
.just 
.service 
.product 
.PublishingDetailsServiceImpl 
.getPublishingDetails(PublishingDetailsServiceImpl.java:41)

Here is the code:
     private static RuleBase ruleBase;

     public void apply(PublishingDetails publishingDetails,  
Advertisement advertisment)
     {
         StatelessSession statelessSession = getStatelessSession();
         statelessSession.setGlobal("du",new DateUtils());
         Object[] facts = {publishingDetails, advertisment};
         statelessSession.execute(facts);
     }


     public void apply(Publication publication)
     {
         StatelessSession statelessSession = getStatelessSession();
         statelessSession.setGlobal("du",new DateUtils());
         statelessSession.execute(publication);
     }

     private StatelessSession getStatelessSession()
     {
         if (ruleBase == null)
         {
             initRuleBase();
         }
         StatelessSession statelessSession =  
ruleBase.newStatelessSession();
         return statelessSession;
     }

     private void initRuleBase()
     {
         Properties properties = new Properties();
         properties.setProperty("drools.dialect.java.compiler",  
"JANINO");
         PackageBuilderConfiguration conf = new  
PackageBuilderConfiguration(properties);
         PackageBuilder builder = new PackageBuilder(conf);
         try
         {
             SpreadsheetCompiler compiler = new SpreadsheetCompiler();
             String drl = compiler.compile(getSpreadsheetStream(),  
InputType.XLS);
             builder.addPackageFromDrl(new StringReader(drl));
         }
         catch (DroolsParserException e)
         {
             throw new RuntimeException("DroolsParserException when  
parsing the drools package", e);
         }
         catch (IOException e)
         {
             throw new RuntimeException("IOException when loading the  
drools package", e);
         }
         PackageBuilderErrors errors = builder.getErrors();
         if (errors != null && !errors.isEmpty())
         {
             for (KnowledgeBuilderError error : errors)
             {
                 LOG.error(error.getMessage());
             }
             throw new RuntimeException("There were errors in the drl  
file");
         }
         Package pkg = builder.getPackage();
         ruleBase = RuleBaseFactory.newRuleBase();
         ruleBase.addPackage(pkg);
     }

As I said before the loading of the rules is OK. I'm wondering if  
keeping a static reference to the RuleBase might be the issue?
The exception looks like Drools is trying to load a jar file at  
runtime. Maybe there is a problem with the container (Jboss 4.2.2)?

If someone could confirm that I'm not doing anything wrong by keeping  
a static reference to the RuleBase that would be appreciated. Note  
that the system runs perfectly and then starts throwing this exception  
with no apparent pattern to the failure.

Cheers

James

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100216/2cf08bad/attachment.html 


More information about the rules-users mailing list