dynamically add rules in Drools 6 during stateful session

痞子三分冷 提交于 2019-12-08 06:30:26

问题


Hello dear programmers,

I try to add a DRL to the KieFilesystem after the KnowledgeBase and the KnowledgeSession is built. But the rules actually won't fire.

Could you guys please try to help me?

Thanks to every solution attempt in advance!

MyCode:

public class Playground {
    private String newline = System.getProperty("line.separator");

    private int MIN_VALUE = -2147483648;

    public static void main(String[] args) {
        Playground pg = new Playground();
        pg.doRules();
    }

    private String generateDRLString() {
        StringBuilder sb;
        sb = new StringBuilder();
        sb.append("package performance.drools;" + newline);
        for (int i = start; i <= end; i++) {
            sb.append("rule \"R" + i + "\"" + newline);
            sb.append("when" + newline);
            sb.append("then" + newline);
            sb.append("System.out.println(\"rule" + i + " fired!\");" + newline);
            sb.append("end" + newline);
        }
        return sb.toString();
    }

    KieServices kieServices;
    KieContainer kieContainer;
    KieBaseConfiguration kieBaseConf;
    KieBase kieBase;
    KieSession kieSession;
    KieFileSystem kfs;
    KieBuilder kieBuilder;
    KieScanner kieScanner;
    int start = MIN_VALUE;
    int end = MIN_VALUE;
    int count = 0;

    private void init() {

        kieServices = KieServices.Factory.get();
        // configure module
        KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
        KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("KBase1 ")
            .setDefault(true)
            .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
            .setEventProcessingMode(EventProcessingOption.CLOUD);

        KieSessionModel kieSessionModel1 = kieBaseModel1
            .newKieSessionModel("KSession1").setDefault(true)
            .setType(KieSessionModel.KieSessionType.STATEFUL)
            .setClockType(ClockTypeOption.get("realtime"));
        // initialize module
        kieBaseConf = kieServices.newKieBaseConfiguration();
        kfs = kieServices.newKieFileSystem();
        System.out.println(kieModuleModel.toXML());
        kfs.writeKModuleXML(kieModuleModel.toXML());

        // attach kfs to kieBuilder
        kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
        assertEquals(0, kieBuilder.getResults()
            .getMessages(Message.Level.ERROR).size());

        kieContainer = kieServices.newKieContainer(kieServices.getRepository()
            .getDefaultReleaseId());
        kieBase = kieContainer.newKieBase(kieBaseConf);
        kieSession = kieBase.newKieSession();
        kieScanner = kieServices.newKieScanner(kieContainer);
    }

    private void addRules() {
        kfs.write("src/main/resources/KBase1/ruleSet" + count + ".drl", generateDRLString());
        count++;
        kieBuilder.buildAll();
        assertEquals(0, kieBuilder.getResults()
            .getMessages(Message.Level.ERROR).size());
        kieScanner.scanNow();
    }

    public void doRules() {
        init();

        start = 1;
        end = 3;
        addRules();
        kieSession.insert(new Object());

        start = 10;
        end = 12;
        addRules();
        kieSession.fireAllRules();

        System.out.println(kieSession.getFactCount());
    }
}

来源:https://stackoverflow.com/questions/22181057/dynamically-add-rules-in-drools-6-during-stateful-session

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!