Sunday, December 6, 2015

Creating Drools Knowledgebase, Knowledgesession and Facts

KnowledgeBase is an interface which manages a collection of knowledge definitions like rules, Internal Types and process. Knowledge packages are created by grouping knowledge definition. Since the creation of Knowledge packages is very expensive, KnowledgeBase stores and reuse them. Knowledge Sessions are created from KnowledgeBase, which consumes less memory. KnowledgeBase keeps track of each Knowledge Session, so that updates to knowledge base can be applied to all the session at run time. Another advantage of KnowledgeBase is that, it is completely serializable. We can restore serializable object of KnowledgeBase rather creating a new one.
There are two types of Knowledge Sessions 
  1. StatelessKnowledgeSession
  2. StatefulKnowledgeSession

Both session implements BatchExecutor interface. In both sessions, we can insert, update and retract facts. Difference between the two is that stateless session automatically executes "FireAllRulesCommand" when facts are inserted/updated. In StatefulKnowledgeSession, after inserting the facts we had to explicitly call "Fire All Rules" Command.
Sample code to create Knowledge Base is given below
public KnowledgeBase CreateKB() {
KnowledgeBase kbDemo = KnowledgeBaseFactory.newKnowledgeBase();
// Create Knowledge Builder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// Add Rule files
// Find errors in rule and work flow file
kbuilder.add(ResourceFactory.newFileResource("D:\\AlarmRule.drl"), ResourceType.DRL);
for (KnowledgeBuilderError error : errors) {
KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { System.err.println(error); } }
return kbDemo ;
// Add Knowledge builder to Knowledge Base kbDemo.addKnowledgePackages(kbuilder.getKnowledgePackages()); // return Knowledge Base
}
Sample code to create Knowledge Session is given below
KnowledgeBase kbase = CreateKB();
StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession();

No comments: