私は Drools にかなり慣れていないので、おそらく本当にばかげたことをしているのでしょう。問題は、何らかの理由で Drools ルールが起動されないことです。使用されている drools のバージョンは 5.4 です。
それが役立つ場合は、a に戻りStatelessKnowledgeSession
、execute メソッドを使用してルールを起動すると、ルールが起動します。ただし、AgendaFilter
ルールをフィルター処理するために使用する必要があり、アジェンダ フィルターがまだサポートされていないことを理解してStatelessKnowledgeSession
います。最初のステップとして、セッションを に切り替え、StatefulKnowledgeSession
ファクトを挿入し、すべてのルールを実行しました。
この数日間、私は頭を悩ませていたと謙虚に言わなければなりませんでした。残念ながら、ドキュメンテーションはよだれを垂らす人にとってそれほどフレンドリーではありません (公式ドキュメントとユーザーガイドを参照してください。
Rule Validator コードと、ルール ファイルからナレッジをロードする Spring ファクトリ 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;
import java.util.Map;
import org.apache.log4j.Logger;
import org.drools.KnowledgeBase;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.springframework.beans.factory.FactoryBean;
public class KnowledgeBaseFactory implements FactoryBean<KnowledgeBase> {
private static Logger logger=Logger.getLogger(KnowledgeBaseFactory.class);
private KnowledgeBase knowledgeBase;
public KnowledgeBaseFactory(Map<String,ResourceType> resourceMap) throws IOException {
logger.debug("Resource Map : "+resourceMap);
final KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
for (Map.Entry<String, ResourceType> eachRuleResource:resourceMap.entrySet()){
knowledgeBuilder.add(ResourceFactory.newClassPathResource(eachRuleResource.getKey()),eachRuleResource.getValue());
}
if (knowledgeBuilder.hasErrors()){
logger.error(knowledgeBuilder.getErrors().toString());
throw new RuntimeException(knowledgeBuilder.getErrors().toString());
}
knowledgeBase = knowledgeBuilder.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
}
@Override
public KnowledgeBase getObject() throws Exception {
return knowledgeBase;
}
@Override
public Class<?> getObjectType() {
return knowledgeBase.getClass();
}
@Override
public boolean isSingleton() {
return true;
}
}