Drools 6 Documentation ナナメ読みその2

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.3.4. Maven Versions and Dependencies

Mavenのバージョン表記についていろいろ。確か修正中のJIRAなどもあったので、使えるパターンについては要注意だ。

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.4.9. Persistence and Transactions

JPA/トランザクションのセット使いで、ksessionを永続化できる。jBPMでは基本。

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

でルール/プロセスに適用するポリシーを指定できる。