3

我在 GAE 上运行 drools 5.5.0 的修改版本。我使用了red piranha 项目中的说明并将它们应用到 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 吗?谢谢!

4

1 回答 1

1

好的,我可以通过返回由 red-piranha 定制的 5.1.1 版本的 Drools 来解决这个问题(请参阅http://code.google.com/p/red-piranha/wiki/ModifyDroolsRunInGoogleAppEngine)。使用他们的 drools-{api,core}.jar 文件,只要我在本地将规则文件从 .drl 编译到 base64 并将生成的文件包含到 GAE 应用程序中,我就可以在本地和 GAE 上成功运行规则。这一切都在他们的维基页面上进行了描述。

更新

我自己尝试实现规则代码。我的自定义解决方案比 drools 实现要快得多,并且使用的内存更少。使用 drools 可能会使您在最小的 GAE 实例类型上超过 128MB。在其他项目上,花更多的钱购买 256MB 的实例可能是值得的。特别是考虑到如果规则代码不必手写的话,可能会节省开发时间。不过,我运行规则代码的频率如此之高,以至于它变成了一个无法接受的性能问题,我不得不花时间自己编写规则代码。

于 2012-11-15T22:20:07.377 回答