在初識drools中對drl文件進行了簡單的介紹。這里舉個例子來具體說明下。主要是寫了規則之后我們如何用java代碼來run起來。
drl文件內容如下:
rule "ageUp12" when
$student: Student(age > 2)
then
$student.ageUp12();
end
rule "nameMax" when
$student: Student(name == "max")
then
$student.nameMax();
retract($student);
end
rule "class" when
$student:Student()
then
$student.toString();
retract($student);
end
rule "testList" when
$student : Student($age : age)
not Student(age < $age)
then
System.out.println("age = " + $age);
retract($student);//這里導致了LHS的變化 然后會重新觸發規則的匹配慎用 這里只是為了展示排序的例子,然后這個rule可以排序。。。。
end
我們在文件中import了一個Student類,代碼很簡單,就是一個javaBean,里面有兩個字段:int age和String name;然后還有幾個方法,ageUp12(),nameMax()
然后我們怎么把這個文件和java代碼關聯起來呢,直接上代碼
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
//ResourceFactroy是個獲取各種資源的工廠,比如newUrlResource,這里ResourceType指明了規則文件的類型,里面有我們在決策表中用到的xls哦
knowledgeBuilder.add(ResourceFactory.newClassPathResource("drools/mydrools.drl"), ResourceType.DRL);
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession();
Student student = new Student(13,"max");
Student student1 = new Student(11,"max");
knowledgeSession.insert(student);//具體的java類對象添加到workingMemory中。
knowledgeSession.insert(student1);
knowledgeSession.fireAllRules();
在這段代碼里我們看到 最后真正去執行的是一個叫做knowledgeSession的東西,這是一個會話,實現了KieSession接口,這個接口的實現類本身包含數據,規則並且執行真正的操作。在規則表里面還會提到。
然后前面我們構造了一個KnowledgeBuilder,來把規則文件加載到drools里,然后構造了一個KnowledgeBase,並從這個KnowlegeBase中獲取一個實際操作的會話。
這里對這幾個class做一下簡單介紹:
KnowledgeBuilder主要是加載規則文件到drools規則引擎中,用於根據規則引擎文件來構造知識倉庫。
KnowledgeBase是對一個規則文件的抽象,可以看下他的父類接口KieBase,在英文文檔中是這么介紹的:KieBase就是一個知識倉庫,包含了若干的規則、流程、方法等,在Drools中主要就是規則和方法,KieBase本身並不包含運行時的數據之類的,如果需要執行規則KieBase中的規則的話,就需要根據KieBase創建KieSession
StatefulKnowledgeSession是一個KieSession實現類,這個接口在英文文檔中是這么介紹的:KieSession就是一個跟Drools引擎打交道的會話,其基於KieBase創建,它會包含運行時數據,包含“事實 Fact”,並對運行時數據事實進行規則運算
注:這里用到的幾個class都是kie-api中的類,這個api在drools中的作用非常之重要,我們在前面的博客里已經有所講解。而且也是決策表中的主要組件。

