dynamically add rules in Drools 6 during stateful

2019-06-08 04:47发布

问题:

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());
    }
}