3

I am running a modified version of drools 5.5.0 on GAE. I used the instructions from the red piranha project and applied them to version 5.5.0 instead of 5.1.1. I can use drools without any issues as long as I run GAE locally. But once my app is deployed I am getting a AccessControlException every time I want to run the rules.

Error processing rules: {0}
java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
at com.google.appengine.runtime.Request.process-cb8c197a61b3cb9b(Request.java)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:355)
at java.security.AccessController.checkPermission(AccessController.java:567)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ClassLoader.getParent(ClassLoader.java:1224)
at org.drools.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:581)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:174)
at org.drools.rule.JavaDialectRuntimeData$PackageClassLoader.fastFindClass(JavaDialectRuntimeData.java:613)
at org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:254)
at org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:237)
at org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:88)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at org.drools.rule.JavaDialectRuntimeData.wire(JavaDialectRuntimeData.java:433)
at org.drools.rule.JavaDialectRuntimeData.reload(JavaDialectRuntimeData.java:481)
at org.drools.rule.JavaDialectRuntimeData.onBeforeExecute(JavaDialectRuntimeData.java:251)
at org.drools.rule.DialectRuntimeRegistry.onBeforeExecute(DialectRuntimeRegistry.java:138)
at org.drools.common.AbstractRuleBase.readExternal(AbstractRuleBase.java:328)
at org.drools.reteoo.ReteooRuleBase.readExternal(ReteooRuleBase.java:225)
at org.drools.impl.KnowledgeBaseImpl.readExternal(KnowledgeBaseImpl.java:116)
at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1857)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1816)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1394)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:395)
at  AbstractRuleLoader.loadKnowledgeBase(AbstractRuleLoader.java:159)
at AbstractRuleLoader.loadRules(AbstractRuleLoader.java:40)
at RuleRunner.runStatelessRules(RuleRunner.java:48)

Is anyone running this version of drools successfully on GAE? Thanks!

Ingo
  • 1,552
  • 10
  • 31

1 Answers1

1

Ok, I was able to fix this by going back to the 5.1.1 version of Drools that was customized by red-piranha (see http://code.google.com/p/red-piranha/wiki/ModifyDroolsRunInGoogleAppEngine). Using their drools-{api,core}.jar files I can successfully run rules both locally and on GAE as long as I compile the rule files from .drl to base64 locally and include the generated files into the GAE app. This is all described on their wiki page.

Update:

I experimented with implementing the rule code myself. My custom solution was significantly faster and used less memory than the drools implementation. Using drools might bring you over the 128MB available on the smallest GAE instance type. On other projects it might be worth spending more money on a 256MB instance. Especially considering the potential savings in development time if the rules code does not have to be hand-written. I was running the rules code so frequently though, that it became an unacceptable performance problem and I had to invest the time to write the rules code myself.

Ingo
  • 1,552
  • 10
  • 31
  • Can you please give some feedback on the memory consumption on GAE? do you serialize your KnowledgeBase objects to datastore? do they fit in blobs? I'd like to know if it's a good idea to use drools on gae. Thanks and best reagrds – Zied Hamdi May 13 '14 at 08:59