1

私は 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;
    }
}
4

1 に答える 1

2

ヒント@Nimをありがとう

やっとわかった。API ドキュメントを適切に読むべきでした。
どうやら、私はIterableオーバーロードexecuteされたメソッドを使用してStatelessKnowledgeSessionいたようです。これは、すべてのファクトを繰り返し処理し、それぞれのファクトに対してルールを適用します。

ただし、 ではStatefulKnowledgeSession、事前に繰り返し、事実を 1 つずつ挿入する必要があります。そして、ルールを起動できました。

insert(Iterable)にメソッドがない理由StatefulKnowledgeSession

于 2012-09-03T10:16:09.043 に答える