Drools學習筆記2

接上面的代碼:

 

public class DroolsTest {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            // go !
            PeopleEvent pe = new PeopleEvent();
            pe.setComming(true);
            pe.setRoomId(1);
            TemperatureEvent te =  new TemperatureEvent();
            te.setTemperature(19.5f);
            te.setRoomId(1);
            ksession.insert(pe);
            ksession.insert(te);
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("FirstRule.drl"), ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

    public static class PeopleEvent {
    	private boolean isComming;
    	private int roomId;
    	
		public boolean getIsComing() {
			return isComming;
		}
		public void setComming(boolean isComming) {
			this.isComming = isComming;
		}
		public int getRoomId() {
			return roomId;
		}
		public void setRoomId(int roomId) {
			this.roomId = roomId;
		}
    }
    public static class TemperatureEvent{
    	private float temperature;
    	private int roomId;
		public float getTemperature() {
			return temperature;
		}
		public void setTemperature(float temperature) {
			this.temperature = temperature;
		}
		public int getRoomId() {
			return roomId;
		}
		public void setRoomId(int roomId) {
			this.roomId = roomId;
		}
    }
}

 

 好了,接下來介紹一下如何來執行Drools是如何來執行規則的,要理解上面的代碼首先要清楚Drools API中關於一下幾個類的描述:

1)      KnowledgeBuilder  

        KnowledgeBuilder就是用來在業務代碼中收集已經編好的規則,找到這些規則並把這些規則文件進行編譯,最終產生一批編譯好的規則包(KnowledgePackage)給其它的應用程序使用。而創建KnowledgeBuilder對象使用的是KnowledgeBuilderFactorynewKnowledgeBuilder方法。

2)      KnowledgeBase

       KnowledgeBase Drools提供的用來收集應用當中知識(Knowledge)定義的知識庫對象,在一個KnowledgeBase 當中可以包含普通的規則、規則流、函數定義、用戶自定義對象等。KnowledgeBase本身不包含任何業務數據對象(fact 對象),業務對象都是插入到由KnowledgeBase產生的兩種類型的session對象(StatefulKnowledgeSessionStatelessKnowledgeSession在後面進行介紹),而這兩種session對象可以用來觸發規則。

3)      StatefulKnowledgeSession

     StatefulKnowledgeSession對象是一種最常用的與規則引擎進行交互的方式,它可以與規則引擎建立一個持續的交互通道。StatefulKnowledgeSession執行完之後一定要調用dispose()方法釋放資源。

     StatefulKnowledgeSession可以接受外部插入(insert方法)的業務數據——也叫fact,一個對象通常可以對應一個普通的POJO, 而一個POJO有若干個屬性來描述這個業務對象,比如一個PeopleEvent中包含了isComing(人是否進來屬性), roomed(房間號),每一個屬性對應gettersetter方法,供規則定義來使用(注意:在規則定義中isComing默認的getter方法是getIsComing())。如果規則當中需要有數據傳出,那麼可以通過在StatefulKnowledgeSession當中設置global對象來實現,一個global對象也是一個普通的Java對象,在向StatefulKnowledgeSession當中設置global對象時不用insert方法而用setGlobal方法實現。

4)      StatelessKnowledgeSession

        StatelessKnowledgeSession是在StatefulKnowledgeSession基礎上進行進一步的封裝,它跟StatefulKnowledgeSession的區別就是它不在需要調用dispose()方法釋放內存資源了,但它不能重複的插入fact的操作、也不能重複的調用fireAllRules()方法來執行所有的規則,因爲它不能保存狀態,對應的這些要完成的工作在StatelessKnowledgeSession當中只有execute()方法,通過這個方法可以實現插入所有的fact並且可以同時執行所有的規則或規則流。

         結合上面的代碼應該可以更好的瞭解這四個概念。下面介紹如何更好的使用Drools

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章