Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 口水规则不会被解雇_Java_Drools - Fatal编程技术网

Java 口水规则不会被解雇

Java 口水规则不会被解雇,java,drools,Java,Drools,我不太会流口水,可能正在做一些非常愚蠢的事情。问题是出于某种原因,我的口水规则没有被解雇。使用的drools版本为5.4 如果有帮助,当我切换回无状态知识会话并使用execute方法触发规则时,规则就会触发。但是,我需要使用AgendaFilter来过滤规则,我知道statelementalknowledgesession还不支持议程过滤器。作为第一步,我只是将会话切换到一个StatefulKnowledgeSession,插入事实并触发所有规则 不得不谦虚地说,在过去的几天里,我都在为此伤脑筋

我不太会流口水,可能正在做一些非常愚蠢的事情。问题是出于某种原因,我的口水规则没有被解雇。使用的drools版本为5.4

如果有帮助,当我切换回
无状态知识会话
并使用execute方法触发规则时,规则就会触发。但是,我需要使用
AgendaFilter
来过滤规则,我知道
statelementalknowledgesession
还不支持议程过滤器。作为第一步,我只是将会话切换到一个
StatefulKnowledgeSession
,插入事实并触发所有规则

不得不谦虚地说,在过去的几天里,我都在为此伤脑筋。太糟糕了,文档对drools不太友好(我参考了官方文档和用户指南)

下面引用了我从规则文件加载知识的规则验证器代码和Spring factory bean。我个人认为FactoryBean没有任何问题。任何指针都会有很大帮助

RuleValidator.java

StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
ksession.setGlobal("validationReport", validationReport);
ksession.setGlobal("simpleCache", simpleCache);
ksession.setGlobal("ruleValidator", this);

ksession.insert(allClientDetails); //this is a list of ClientDetails objects (facts)
ksession.fireAllRules();
ksession.dispose();

return validationReport;
KnowledgeBaseFactory.java

import java.io.IOException;
导入java.util.Map;
导入org.apache.log4j.Logger;
导入org.drools.KnowledgeBase;
导入org.drools.builder.KnowledgeBuilder;
导入org.drools.builder.KnowledgeBuilderFactory;
导入org.drools.builder.ResourceType;
导入org.drools.io.Resource;
导入org.drools.io.ResourceFactory;
导入org.springframework.beans.factory.FactoryBean;
公共类KnowledgeBaseFactory实现FactoryBean{
私有静态记录器=Logger.getLogger(KnowledgeBaseFactory.class);
私有知识库知识库;
public KnowledgeBaseFactory(地图资源地图)引发IOException{
调试(“资源映射:“+resourceMap”);
最终KnowledgeBuilder KnowledgeBuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
对于(Map.Entry eachRuleResource:resourceMap.entrySet()){
添加(ResourceFactory.newClassPathResource(eachRuleResource.getKey()),eachRuleResource.getValue());
}
if(knowledgeBuilder.hasErrors()){
logger.error(knowledgeBuilder.getErrors().toString());
抛出新的RuntimeException(knowledgeBuilder.getErrors().toString());
}
knowledgeBase=knowledgeBuilder.newKnowledgeBase();
addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
}
@凌驾
public KnowledgeBase getObject()引发异常{
返回知识库;
}
@凌驾
公共类getObjectType(){
返回knowledgeBase.getClass();
}
@凌驾
公共布尔isSingleton(){
返回true;
}
}

谢谢你的提示@Nim

终于明白了。我应该好好阅读API文档。
显然,我在
StatelessKnowledgeSession
中使用了
Iterable
重载
execute
方法,该方法迭代了我的所有事实,并针对每个事实应用规则

然而,使用
StatefulKnowledgeSession
,我应该事先迭代并逐个插入事实。然后,我可以触发规则


为什么在
StatefulKnowledgeSession

中没有
insert(Iterable)
方法,所以您只是更改了行“StatefulKnowledgeSession ksession=knowledgeBase.newStatefulKnowledgeSession();”从无状态KnowledgeSession转到有状态KnowledgeSession而不再工作?对吗?是的。这是正确的。由于我从
无状态KnowledgeSession
execute
方法切换到
有状态KnowledgeSession
中的
fireAllRules
方法,我必须使用
kse>插入事实插入(所有客户端详细信息)
。但是,是的,这就是那里所做的所有更改。如果不知道有什么规则以及事实是什么样子,很难说什么可能是错误的。我会回到基础,首先看看你是否可以得到一个简单的规则,在插入事实时启动,然后从那里开始构建。@Nim同意。我后退一步,开始结束。当我发现有用的东西时,让我回到这里。