我正在GAE上运行drools 5.5.0的修改版本。 我使用了red piranha project中的说明并将其应用到版本5.5.0而不是5.1.1。只要我在本地运行GAE,我就可以使用drools而不会出现任何问题。但是一旦部署了我的应用程序,每次我想运行规则时都会遇到 AccessControlException 。
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)
是否有人在GAE上成功运行此版本的drools?谢谢!
答案 0 :(得分:1)
好的,我能够通过回到由red-piranha定制的Drools的5.1.1版本来解决这个问题(参见http://code.google.com/p/red-piranha/wiki/ModifyDroolsRunInGoogleAppEngine)。使用他们的drools- {api,core} .jar文件我可以在本地和GAE上成功运行规则,只要我将规则文件从.drl编译到本地的base64并将生成的文件包含到GAE应用程序中。这些都在他们的维基页面上描述。
<强>更新强>:
我尝试自己实现规则代码。我的自定义解决方案明显更快,并且使用的内存少于drools实现。使用drools可能会为您提供最小的GAE实例类型上的128MB可用空间。在其他项目中,可能值得在256MB实例上花更多钱。特别是考虑到如果规则代码不必手写,可以节省开发时间。我经常运行规则代码,但这成了一个令人无法接受的性能问题,我不得不花时间自己编写规则代码。