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オブジェクトを作成するには、KnowledgeBuilderFactoryのnewKnowledgeBuilderメソッドを使用します.
2)      KnowledgeBase
KnowledgeBaseはDroolsが提供するアプリケーション内の知識(Knowledge)定義を収集するための知識ベースオブジェクトであり、1つのKnowledgeBaseには一般的なルール、ルールフロー、関数定義、ユーザカスタムオブジェクトなどを含めることができる.KnowledgeBase自体にはビジネス・データ・オブジェクト(factオブジェクト)は含まれません.ビジネス・オブジェクトは、KnowledgeBaseによって生成された2つのタイプのセッション・オブジェクト(StatefulKnowledgeSessionおよびStatelessKnowledgeSessionは後述)に挿入されます.この2つのセッション・オブジェクトは、ルールをトリガーするために使用できます.
3)      StatefulKnowledgeSession
StatefulKnowledgeSessionオブジェクトは、ルールエンジンと継続的なインタラクティブチャネルを確立するために最も一般的なルールエンジンとインタラクティブな方法です.StatefulKnowledgeSessionの実行が完了したら、必ずdispose()メソッドを呼び出してリソースを解放します.
StatefulKnowledgeSessionは外部挿入(insertメソッド)のビジネスデータを受け入れることができます.factとも呼ばれます.1つのオブジェクトは通常1つの普通のPOJOに対応することができます.1つのPOJOには、1つのPeopleEventにisComing(人が入るかどうかのプロパティ)、roomed(部屋番号)、各プロパティはgetterとsetterメソッドに対応するいくつかのプロパティがあります.ルール定義に使用されます(注意:ルール定義でisComingのデフォルトのgetterメソッドはgetisComing()です).ルールにデータ転送が必要な場合は、StatefulKnowledgeSessionにglobalオブジェクトを設定することで実現でき、1つのglobalオブジェクトも通常のJavaオブジェクトであり、StatefulKnowledgeSessionにglobalオブジェクトを設定する際にinsertメソッドを用いずsetGlobalメソッドで実現する.
4)      StatelessKnowledgeSession
StatelessKnowledgeSessionは、StatefulKnowledgeSessionに基づいてさらにカプセル化されています.StatefulKnowledgeSessionとは異なり、dispose()メソッドを呼び出してメモリリソースを解放する必要はありませんが、factを挿入する操作を繰り返すことはできません.fireAllRules()メソッドを繰り返してすべてのルールを実行することはできません.ステータスを保存できないため、対応するこれらの完了する作業はStatelessKnowledgeSessionではexecute()メソッドのみであり、このメソッドによりすべてのfactを挿入し、すべてのルールまたはルールフローを同時に実行することができる.
上記のコードを組み合わせると、この4つの概念をよりよく理解できるはずです.Droolsをよりよく使う方法について説明します.