2013-02-14 98 views
0

我们已经建立了一个基本的Drools框架与Guvnor UI。规则由半技术性的家伙写的和有误差的范围(范围是永远存在的,不论谁写吧:))NPE in drools规则导致CYCLIC_DEPENDENCY和OOM

昨天,有人写了开始呕吐NullPoiterException但口水似乎这个异常包装成CYCLIC_DEPENDENCY_ERROR和规则显示相同。

此外,我们在此问题后立即(3-4分钟)结束OOM java.lang.OutOfMemoryError: Java heap space

堆栈跟踪的详细信息:

Feb 2013 08:06:55,447 [ERROR] (SWF Activity DroolsActivityTaskList-2.2 229) com.amazon.mobius.csi.workers.droolsengine.DroolsEngineActivitiesImpl:runRules:220 [CYCLIC_DEPENDENCY_ERROR]: Error 
while executing Rules, Please validate all rules against any cyclic dependency 
Exception executing consequence for rule "final NON EC" in com.amazon.mobius.csi.workers.droolsengine: java.lang.NullPointerException 
     at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) 
     at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1101) 
     at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1029) 
     at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1251) 
     at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:708) 
     at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:672) 
     at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:218) 
     at org.drools.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:295) 
     at com.amazon.mobius.csi.workers.droolsengine.DroolsEngineActivitiesImpl.runRules(DroolsEngineActivitiesImpl.java:216) 
     at com.amazon.mobius.csi.workers.droolsengine.DroolsEngineActivitiesImpl.executeRules(DroolsEngineActivitiesImpl.java:145) 
     at sun.reflect.GeneratedMethodAccessor173.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at com.amazonaws.services.simpleworkflow.flow.pojo.POJOActivityImplementation.execute(POJOActivityImplementation.java:63) 
     at com.amazonaws.services.simpleworkflow.flow.generic.ActivityImplementationBase.execute(ActivityImplementationBase.java:46) 
     at com.amazonaws.services.simpleworkflow.flow.worker.SynchronousActivityTaskPoller.execute(SynchronousActivityTaskPoller.java:214) 
     at com.amazonaws.services.simpleworkflow.flow.worker.ActivityTaskPoller$2.run(ActivityTaskPoller.java:95) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.NullPointerException 
     at com.amazon.mobius.csi.workers.droolsengine.Rule_final_NON_EC.defaultConsequence(Unknown Source) 
     at com.amazon.mobius.csi.workers.droolsengine.Rule_final_NON_ECDefaultConsequenceInvoker.evaluate(Unknown Source) 
     at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1091) 
     ... 18 more 

为什么Drools的把它当作CYCLIC_DEPENDENCY并导致进入OOM?我们可以有其他问题吗?任何帮助,将不胜感激。

谢谢,

+0

我敢肯定,循环依赖几乎总是最终导致的OOM error.It的价值,说明你用的是什么Drools的/的Guvnor的版本。我怀疑这可能是您的特定版本的依赖性问题。 – Steve 2013-03-18 17:05:33

+0

我们正在使用Drools-5.3。如果您发现任何问题,请告知我们。 – instanceOfObject 2013-03-19 16:33:48

回答

0

我相信这是规则之间的循环依赖关系。一条规则的RHS引起另一条规则的激活,这又有一条RHS导致第一条规则激活。因此有一个无限循环的规则激活。

没有看到规则本身,我会建议设置议程事件侦听器来记录哪些规则正在触发。这样,你应该能够看到以这种方式激活哪两个规则。这样一个例子日志监听是在这里:

https://github.com/gratiartis/scattercode-drools-scenarios/blob/master/src/main/java/uk/co/scattercode/drools/util/TrackingAgendaEventListener.java