http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/index.html#d0e791
II. KIE
4. KIE
4.1. Overview
4.1.1. Anatomy of Projects
KIE, an acronym for Knowledge Is Everything
4.1.2. Lifecycles
4.2. Build, Deploy, Utilize and Run
4.2.1. Introduction
META-INF/kmodule.xml 重要。空の kmodule.xml が最も簡単な設定。空でも必須。
jarはクラスパスから読むか、mavenから動的にダウンロードする。mavenの場合は side by side versioning をサポートする。
4.2.2. Building
4.2.2.1. Creating and building a Kie Project
あ、空って言ってもこうね。
<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"/>
これでリソースを読んで KieContainer をビルドする
KieServices kieServices = KieServices.Factory.get(); KieContainer kContainer = kieServices.getKieClasspathContainer();
KieServices : KIE の ビルド/ランタイム 機能全てにアクセスできるインターフェース
4.2.2.2. The kmodule.xml file
kmodule.xml で KieBase と KieSession を宣言的に設定できる。KieBaseはルール、プロセス、モデルなど全ての knowledge definition を持つ。データは持たない。KieBaseの生成は重い。KieSessionの生成は軽い。なのでKieBaseはキャッシュして使う…が、KieContainerが自動でキャッシュ管理してくれるので、ユーザは基本気にしなくていい。
KieSessionはランタイムのデータを持つ。KieBaseからKieSessionを生成できる。kmodule.xml に定義されていれば KieContainerからでも生成できる。
APIで設定できそうなオプション/リスナ/ロガー/ハンドラを軒並みXMLベースで設定できる感じですね。
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="KBase1" default="true" eventProcessingMode="cloud" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg1"> <ksession name="KSession2_1" type="stateful" default="true/"> <ksession name="KSession2_1" type="stateless" default="false/" beliefSystem="jtms"> </kbase> <kbase name="KBase2" default="false" eventProcessingMode="stream" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1"> <ksession name="KSession2_1" type="stateful" default="false" clockType="realtime"> <fileLogger file="drools.log" threaded="true" interval="10"/> <workItemHandlers> <workItemHandler name="name" type="org.domain.WorkItemHandler"/> </workItemHandlers> <listeners> <ruleRuntimeEventListener type="org.domain.RuleRuntimeListener"/> <agendaEventListener type="org.domain.FirstAgendaListener"/> <agendaEventListener type="org.domain.SecondAgendaListener"/> <processEventListener type="org.domain.ProcessListener"/> </listeners> </ksession> </kbase> </kmodule>
mavenのgroupId/artifactId/versionを指定して、適切な KieContainer を生成できる。
KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "myartifact", "1.0" ); KieContainer kieContainer = kieServices.newKieContainer( releaseId );
4.2.2.3. Building with Maven
kie-maven-plugin を使えば、JAR生成時にバリデーションとプリコンパイルをしてくれる。
<build> <plugins> <plugin> <groupId>org.kie</groupId> <artifactId>kie-maven-plugin</artifactId> <version>${project.version}</version> <extensions>true</extensions> </plugin> </plugins> </build>
4.2.2.4. Defining a KieModule programmatically
kmodule.xml の代わりにAPIでKieBase/KieSessionを作成できる。KieFileSystemを使えば、各リソースファイルを明示的に追加できる。KieFileSystemはKieServicesから取得できる。テストケースとかに使えそう。 KieResourcesは各リソースを生成するファクトリ。
KieFileSystem kfs = ... kfs.write( "src/main/resources/KBase1/ruleSet1.drl", stringContainingAValidDRL ) .write( "src/main/resources/dtable.xls", kieServices.getResources().newInputStreamResource( dtableFileStream ) );
最後にKieFileSystemをKieBuilderに渡してビルド。ビルドが成功するとKieModuleがシングルトンのKieRepositoryに追加される。そのリポジトリからReleaseIdを指定して、KieContainerが取得できる。
KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = ... kieServices.newKieBuilder( kfs ).buildAll(); KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
4.2.3. Deploying
4.2.3.1. KieBase
4.2.3.2. KieSessions and KieBase Modifications
KieBaseの変更はKieSessionに反映される
4.2.3.3. KieScanner
KieScannerはmavenリポジトリを監視して、新規リリースがあればそれをKieContainerにデプロイする。
KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "myartifact", "1.0-SNAPSHOT" ); KieContainer kContainer = kieServices.newKieContainer( releaseId ); KieScanner kScanner = kieServices.newKieScanner( kContainer ); // Start the KieScanner polling the Maven repository every 10 seconds kScanner.start( 10000L );
KieContainerを指定して、KieScannerを生成するっていう関係ですね。
4.2.4. Running
4.2.4.1. KieBase
同じことが繰り返して書かれてるなあ。
4.2.4.2. KieSession
4.2.4.3. KieRuntime
KieRuntimeはKieSessionの親クラス。
4.2.4.3.1.1. Globals
4.2.4.4. Event Model
CEPじゃなくてイベントリスナの話。
4.2.4.5. KieRuntimeLogger
4.2.4.6. Commands and the CommandExecutor
StatelessKieSessionで使うコマンドの話
4.2.4.7. StatelessKieSession
Drools5と変わらない。「一発実行」セッションです。EJBで言うstateful/statelessとは全然違うので注意。
4.2.4.8. Marshalling
KieMarshallersでKieSessionをmarshall/unmarshallできる。 ObjectMarshallingStrategyも考慮しよう。
4.2.5. Installation and Deployment Cheat Sheets
これほんとにチートシートなんだろうか…。そしてなぜ画像オンリー…。
4.2.6. Build, Deploy and Utilize Examples
これ見ろよって話。
https://github.com/droolsjbpm/drools/tree/6.0.x/drools-examples-api
4.3. Security
4.3.1. Security Manager
4.3.1.1. How to define a KIE Policy
-Dkie.security.policy
でルール/プロセスに適用するポリシーを指定できる。