Spring Boot集成Drools7.55.0运行时增删规则偶发ConditionalBranchNode异常
在Spring Boot项目中使用Drools 7.55.0.Final版本,通过org.drools.core.impl.KnowledgeBaseImpl#addPackages实现运行时插入/更新规则,使用org.drools.core.impl.KnowledgeBaseImpl#removeRule删除规则。通常运行正常,但偶发如下异常:
java.lang.RuntimeException: ConditionalBranchNode cannot be shared at org.drools.core.reteoo.ConditionalBranchNode.doRemove(ConditionalBranchNode.java:265) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.common.BaseNode.remove(BaseNode.java:150) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.reteoo.ReteooBuilder.removeLeftTupleNode(ReteooBuilder.java:247) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.reteoo.ReteooBuilder.removePath(ReteooBuilder.java:225) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.reteoo.ReteooBuilder.removeNodes(ReteooBuilder.java:203) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.reteoo.ReteooBuilder.removeTerminalNode(ReteooBuilder.java:196) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.reteoo.ReteooBuilder.removeRules(ReteooBuilder.java:177) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.internalRemoveRules(KnowledgeBaseImpl.java:1575) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.lambda$removeRules$7(KnowledgeBaseImpl.java:1568) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.enqueueModification(KnowledgeBaseImpl.java:748) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.removeRules(KnowledgeBaseImpl.java:1568) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.mergePackage(KnowledgeBaseImpl.java:1309) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.internalAddPackages(KnowledgeBaseImpl.java:912) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.lambda$addPackages$2(KnowledgeBaseImpl.java:731) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.enqueueModification(KnowledgeBaseImpl.java:748) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final] at org.drools.core.impl.KnowledgeBaseImpl.addPackages(KnowledgeBaseImpl.java:731) ~[drools-core-7.55.0.Final.jar!/:7.55.0.Final]
该异常并非必现,难以定位根因。以下是增/更新规则的代码:
KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder(); kb.add(ResourceFactory.newByteArrayResource(content.getBytes()), ResourceType.DRL); KnowledgeBuilderErrors errors = kb.getErrors(); if (!CollectionUtils.isEmpty(errors)) { for (KnowledgeBuilderError error : errors) { log.error(error.toString()); } throw new RuntimeException("load rules error"); } InternalKnowledgeBase kBase = (InternalKnowledgeBase) kieBase; kBase.addPackages(kb.getKnowledgePackages());
删除规则的代码:
kieBase.removeRule("rules", name);
通过接口触发上述增删操作,同时规则会被kieSession.fireAllRules()调用,请教是否有人遇到过该问题,以及如何解决?
内容的提问来源于stack exchange,提问作者Young
相关产品推荐
相关产品推荐

