3

GAE で drools 5.5.0 の修正バージョンを実行しています。red piranha プロジェクトの手順を使用して、バージョン 5.1.1 ではなくバージョン 5.5.0 に適用しました。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)

このバージョンの drools を GAE で正常に実行している人はいますか? ありがとう!

4

1 に答える 1

1

OK、red-piranha によってカスタマイズされた Drools の 5.1.1 バージョンに戻ることで、これを修正できました ( http://code.google.com/p/red-piranha/wiki/ModifyDroolsRunInGoogleAppEngineを参照)。drools-{api,core}.jar ファイルを使用すると、ルール ファイルを .drl から base64 にローカルでコンパイルし、生成されたファイルを GAE アプリに含める限り、ローカルと GAE の両方でルールを正常に実行できます。これはすべて、彼らの wiki ページで説明されています。

更新

私はルールコードを自分で実装して実験しました。私のカスタム ソリューションは、drools の実装よりも大幅に高速であり、使用するメモリも少なくなりました。drools を使用すると、最小の GAE インスタンス タイプで使用可能な 128MB を超える可能性があります。他のプロジェクトでは、256MB のインスタンスにより多くのお金を費やす価値があるかもしれません。特に、ルール コードを手書きする必要がなければ、開発時間を節約できる可能性があることを考慮してください。しかし、ルール コードを頻繁に実行していたため、許容できないパフォーマンスの問題が発生し、時間をかけてルール コードを自分で作成する必要がありました。

于 2012-11-15T22:20:07.377 に答える