第5章 DRL ファイルを作成するその他の方法
Decision Central インターフェースに DRL ファイルを作成し管理する代わりに、Red Hat Developer Studio、Java オブジェクト、または Maven アーキタイプを使用して、外部のスタンドアロンプロジェクトに DRL ファイルを作成できます。このスタンドアロンプロジェクトは、ナレッジ JAR (kJAR) 依存関係として、Decision Central の既存の Red Hat Decision Manager プロジェクトに統合できます。スタンドアロンプロジェクトの DRL ファイルには、最低でも必要な package 仕様、import リスト、および rule 定義が含まれる必要があります。グローバル変数や関数など、その他の DRL コンポーネントは任意です。DRL ルールに関連するすべてのデータオブジェクトは、スタンドアロンの DRL プロジェクトまたはデプロイメントに含まれる必要があります。
5.1. Red Hat JBoss Developer Studio への DRL ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat JBoss Developer Studio を使用して、ルールを持つ DRL ファイルを作成し、Red Hat Decision Manager デシジョンサービスにファイルを統合します。DRL ルールを作成する方法は、デシジョンサービスに Red Hat Developer Studio を使用する場合や、同じワークフローを継続したい場合に便利です。この方法を使用していない場合は、Red Hat Decision Manager の代わりに Decision Central インターフェースを使用して、DRL ファイルや、その他のルールアセットを作成することが推奨されます。
前提条件
Red Hat カスタマーポータル から Red Hat JBoss Developer Studio をインストールしています。
手順
-
Red Hat JBoss Developer Studio で、File
New Project をクリックします。 -
開いた New Project ウィンドウで、Drools
Drools Project を選択し、Next をクリックします。 - Create a project and populate it with some example files to help you get started quickly の 2 番目のアイコンをクリックして、Next をクリックします。
Project name を入力し、プロジェクトのビルドオプションで Maven ラジオボタンを選択します。GAV 値が自動的に生成されます。必要に応じて、プロジェクトに対してこの値を更新できます。
-
Group ID:
com.sample -
Artifact ID:
my-project -
Version:
1.0.0-SNAPSHOT
-
Group ID:
Finish をクリックしてプロジェクトを作成します。
これは、基本的なプロジェクト構造、クラスパス、サンプルルールを設定します。以下は、プロジェクト構造の概要です。
my-project `-- src/main/java | `-- com.sample | `-- DecisionTable.java | `-- DroolsTest.java | `-- ProcessTest.java | `-- src/main/resources | `-- dtables | `-- Sample.xls | `-- process | `-- sample.bpmn | `-- rules | `-- Sample.drl | `-- META-INF | `-- JRE System Library | `-- Maven Dependencies | `-- Drools Library | `-- src | `-- target | `-- pom.xml以下の要素に注目してください。
-
src/main/resourcesディレクトリーのSample.drlルールファイル。これには、サンプルのHello WorldルールおよびGoodByeルールが含まれます。 -
com.sampleパッケージのsrc/main/javaディレクトリーにあるDroolsTest.javaファイル。DroolsTestクラスを使用してルールを実行できます。 -
実行するのに必要な JAR ファイルを含むカスタムのクラスパスとなる
Drools Libraryディレクトリー。
-
DRL ファイルで必要なすべてのオブジェクトを使用して、ファクトモデルを作成します。
DroolsTest.javaファイルには、ゲッターメソッドおよびセッターメソッドを使用するサンプルの Java オブジェクトMessageが含まれます。このクラスを編集するか、別の Java オブジェクトを作成します。この例では、Personクラスに、名前、苗字、時給、賃金を設定および取得するメソッドが使用されます。public static class Person { private String firstName; private String lastName; private Integer hourlyRate; private Integer wage; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getHourlyRate() { return hourlyRate; } public void setHourlyRate(Integer hourlyRate) { this.hourlyRate = hourlyRate; } public Integer getWage(){ return wage; } public void setWage(Integer wage){ this.wage = wage; } }main()メソッドをアップデートして、Java オブジェクトをルールに渡します。DroolsTest.javaファイルには、ナレッジベースをロードし、ファクトを挿入し、ルールを実行するmain()メソッドが含まれます。次のメソッドアップデートは、Personオブジェクトをルールに渡します。public static final void main(String[] args) { try { // Load the knowledge base: KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession("ksession-rules"); // Go! Person p = new Person(); p.setWage(12); p.setFirstName("Tom"); p.setLastName("Summers"); p.setHourlyRate(10); kSession.insert(p); kSession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } }ナレッジベースをロードするには、
KieServicesインスタンスと、クラスパスベースのKieContainerを取得して、KieContainerを指定したKieSessionを構築します。前の例では、kmodule.xmlファイルに定義したものと一致したksession-rulesセッションが渡されます。最低でも、ルールで使用するパッケージ仕様、データオブジェクトのインポートリスト、
when条件およびthenアクションが指定されたルールが 1 つ以上含まれる DRL ファイルを作成します。ルールファイル
Sample.drlには、2 つのルール例が含まれます。このファイルを編集するか、新たに作成できます。package com.sample import com.sample.DroolsTest.Person; dialect "java" rule "Wage" when Person(hourlyRate * wage > 100) Person(name : firstName, surname : lastName) then System.out.println("Hello" + " " + name + " " + surname + "!"); System.out.println("You are rich!"); end-
File
Save に移動して、ファイルを保存します。 -
プロジェクトで DRL アセットをすべて作成して保存したあと、プロジェクトフォルダーを右クリックして、Run As
Java Application を選択してプロジェクトをビルドします。プロジェクトのビルドに失敗したら、Developer Studio の下部ウィンドウの Problems タブに記載されている問題に対応し、プロジェクトビルドされるまで妥当性確認を行います。
プロジェクトを右クリックして、Run As を選択した場合に Java Application が選択肢にない場合は、Run As
Red Hat Decision Manager で、新しいルールアセットを既存プロジェクトと統合するには、新しいプロジェクトをナレッジ JAR (kJAR) としてコンパイルし、Decision Central のプロジェクトの pom.xml ファイルに依存関係として追加します。
5.2. Java を使用して DRL ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
Java オブジェクトを使用して、ルールを持つ DRL ファイルを作成し、Red Hat Decision Manager デシジョンサービスにオブジェクトを統合します。DRL ルールを作成する方法は、デシジョンサービスに外部 Java オブジェクトを使用している場合や、同じワークフローを継続したい場合に便利です。この方法を使用しなくなった場合は、Red Hat Decision Manager の Decision Central インターフェースを使用して、DRL ファイルや、その他のルールアセットを作成することが推奨されます。
手順
ルールが有効な Java オブジェクトを作成します。
この例では、
my-projectディレクトリーにPerson.javaファイルが作成されます。Personクラスには、名前、苗字、時給、賃金を設定および取得するゲッターメソッドおよびセッターメソッドが含まれます。public class Person { private String firstName; private String lastName; private Integer hourlyRate; private Integer wage; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getHourlyRate() { return hourlyRate; } public void setHourlyRate(Integer hourlyRate) { this.hourlyRate = hourlyRate; } public Integer getWage(){ return wage; } public void setWage(Integer wage){ this.wage = wage; } }my-projectディレクトリーに.drlフォーマットのルールファイルを作成します。以下の
Person.drlルールでは、賃金と時給を計算し、その結果に基づいてメッセージを表示します。dialect "java" rule "Wage" when Person(hourlyRate * wage > 100) Person(name : firstName, surname : lastName) then System.out.println("Hello" + " " + name + " " + surname + "!"); System.out.println("You are rich!"); end- メインクラスを作成し、Java オブジェクトを作成したディレクトリーに保存します。メインクラスはナレッジベースをロードし、ルールを実行します。
メインクラスに、KIE サービス、KIE コンテナー、および KIE セッションをインポートするのに必要な
import命令文を追加します。つぎに、ナレッジベースをロードし、ファクトを挿入し、ファクトモデルをルールに渡すmain()メソッドからルールを実行します。以下の例では、必要なインポートがリストされ、メインクラス
DroolsTest.javaが作成されます。import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public class DroolsTest { public static final void main(String[] args) { try { // Load the knowledge base: KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession(); // Go! Person p = new Person(); p.setWage(12); p.setFirstName("Tom"); p.setLastName("Summers"); p.setHourlyRate(10); kSession.insert(p); kSession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } }-
Red Hat カスタマーポータル から Red Hat Decision Manager 7.0 Core Engine ZIP ファイルをダウンロードし、
my-project/dm-engine-jars/で展開します。 my-project/META-INFディレクトリーに、以下の内容のkmodule.xmlメタデータファイルを作成します。<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://www.drools.org/xsd/kmodule"> </kmodule>この
kmodule.xmlファイルは、ナレッジベースへのリソースを選択し、セッションを設定する記述子です。このファイルを使用すると、KIE ベースを 1 つ以上定義して設定し、特定の KIE の特定のpackagesから DRL ファイルを追加できます。各 KIE ベースから KIE セッションを 1 つ以上作成することもできます。次の例は、より高度な
kmodule.xmlファイルを表示します。<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="KBase1" default="true" eventProcessingMode="cloud" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg1"> <ksession name="KSession1_1" type="stateful" default="true" /> <ksession name="KSession1_2" 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="debugInfo" threaded="true" interval="10" /> <workItemHandlers> <workItemHandler name="name" type="new 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>この例は、KIE ベースを 2 つ定義します。KIE ベース
KBase1から 2 つの KIE セッションをインスタンス化し、KBase2から 1 つの KIE セッションをインスタンス化します。ルールアセットで特定のpackagesが両方の KIE ベースに含まれます。この方法でパッケージを指定した場合は、指定したパッケージを反映するフォルダー構造で DRL ファイルを整理する必要があります。Java オブジェクトですべての DRL アセットを作成して保存したあと、コマンドラインで
my-projectディレクトリーに移動し、以下のコマンドを実行して Java ファイルを構築します。DroolsTest.javaを、Java のメインクラス名に置き換えます。javac -classpath "./dm-engine-jars/*:." DroolsTest.javaビルドに失敗したら、コマンドラインのエラーメッセージに記載されている問題に対応し、エラーが表示されなくなるまで Java オブジェクトの妥当性確認を行います。
Java ファイルが問題なくビルトできたら、以下のコマンドを実行してルールを実行します。
DroolsTestを、Java メインクラスの接頭辞に置き換えます。javac -classpath "./dm-engine-jars/*:." DroolsTest- ルールを見直して、適切に実行したことを確認し、Java ファイルで必要な変更に対応します。
新しいルールアセットを、Red Hat Decision Manager の既存のプロジェクトと統合するには、新しい Java プロジェクトをナレッジ JAR (kJAR) としてコンパイルし、Decision Central でプロジェクトの pom.xml ファイルの依存関係として追加します。
5.3. Maven を使用して DRL ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
Maven アーキタイプを使用して、ルールを持つ DRL ファイルを作成し、アーキタイプを Red Hat Decision Manager デシジョンサービスに統合します。DRL ルールを作成する方法は、デシジョンサービスに外部 Maven アーキタイプを使用している場合や、同じワークフローを継続したい場合に便利です。この方法を使用しなくなった場合は、Red Hat Decision Manager の Decision Central インターフェースを使用して、DRL ファイルや、その他のルールアセットを作成することが推奨されます。
手順
Maven アーキタイプを作成するディレクトリーに移動して、次のコマンドを実行します。
mvn archetype:generate -DgroupId=com.sample.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=falseこれにより、
my-appという名前のディレクトリーが、以下の構造で作成されます。my-app |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- sample | `-- app | `-- App.java `-- test `-- java `-- com `-- sample `-- app `-- AppTest.javamy-appディレクトリーには、以下の重要なコンポーネントが含まれます。-
アプリケーションソースを保存する
src/mainディレクトリー -
テストソースを保存する
src/testディレクトリー -
プロジェクト設定ファイル
pom.xml
-
アプリケーションソースを保存する
Maven アーキタイプに、ルールが有効な Java オブジェクトを作成します。
この例では、
my-app/src/main/java/com/sample/appディレクトリーにPerson.javaファイルが作成されます。Personクラスには、名前、苗字、時給、賃金を設定および取得するゲッターメソッドおよびセッターメソッドが含まれます。package com.sample.app; public class Person { private String firstName; private String lastName; private Integer hourlyRate; private Integer wage; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getHourlyRate() { return hourlyRate; } public void setHourlyRate(Integer hourlyRate) { this.hourlyRate = hourlyRate; } public Integer getWage(){ return wage; } public void setWage(Integer wage){ this.wage = wage; } }my-app/src/main/resources/rulesディレクトリーに.drlフォーマットのルールファイルを作成します。以下の
Person.drlルールはPersonクラスをインポートし、賃金および時給の値を計算し、結果に基づいてメッセージを表示します。package com.sample.app; import com.sample.app.Person; dialect "java" rule "Wage" when Person(hourlyRate * wage > 100) Person(name : firstName, surname : lastName) then System.out.println("Hello " + name + " " + surname + "!"); System.out.println("You are rich!"); endmy-app/src/main/resources/META-INFディレクトリーに、以下の内容のkmodule.xmlメタデータファイルを作成します。<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://www.drools.org/xsd/kmodule"> </kmodule>この
kmodule.xmlファイルは、ナレッジベースへのリソースを選択し、セッションを設定する記述子です。このファイルを使用すると、KIE ベースを 1 つ以上定義して設定し、特定の KIE の特定のpackagesから DRL ファイルを追加できます。各 KIE ベースから KIE セッションを 1 つ以上作成することもできます。次の例は、より高度な
kmodule.xmlファイルを表示します。<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="KBase1" default="true" eventProcessingMode="cloud" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg1"> <ksession name="KSession1_1" type="stateful" default="true" /> <ksession name="KSession1_2" 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="debugInfo" threaded="true" interval="10" /> <workItemHandlers> <workItemHandler name="name" type="new 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>この例は、KIE ベースを 2 つ定義します。KIE ベース
KBase1から 2 つの KIE セッションをインスタンス化し、KBase2から 1 つの KIE セッションをインスタンス化します。ルールアセットで特定のpackagesが両方の KIE ベースに含まれます。この方法でパッケージを指定した場合は、指定したパッケージを反映するフォルダー構造で DRL ファイルを整理する必要があります。my-app/pom.xml設定ファイルで、アプリケーションが要求するライブラリーを指定します。Red Hat Decision Manager の依存関係と、アプリケーションのgroup ID、artifact ID、およびversion(GAV) を提供します。<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sample.app</groupId> <artifactId>my-app</artifactId> <version>1.0.0</version> <repositories> <repository> <id>jboss-ga-repository</id> <url>http://maven.repository.redhat.com/ga/</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>VERSION</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>VERSION</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>Red Hat Decision Manager でサポートされる Maven アーティファクトのバージョンについては『Red Hat Decision Manager のオンプレミスインストール』を参照してください。
-
my-app/src/test/java/com/sample/app/AppTest.javaのtestAppメソッドを使用してルールをテストします。Maven によって、AppTest.javaファイルがデフォルトで作成されます。 AppTest.javaファイルで、KIE サービス、KIE コンテナー、および KIE セッションをインポートするのに必要なimport命令文を追加します。ナレッジベースをロードし、ファクトを挿入し、ファクトモデルをルールに渡すtestApp()メソッドからルールを実行します。以下の例では、必要なインポートがリストされ、ファクトモデル
DroolsTest.javaが作成されました。import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public void testApp() { // Load the knowledge base: KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession(); // Set up the fact model: Person p = new Person(); p.setWage(12); p.setFirstName("Tom"); p.setLastName("Summers"); p.setHourlyRate(10); // Insert the person into the session: kSession.insert(p); // Fire all rules: kSession.fireAllRules(); }Maven アーキタイプにすべての DRL アセットを作成して保存したあと、コマンドラインで
my-appディレクトリーに移動し、以下のコマンドを実行してファイルを作成します。mvn clean installこのコマンドを最初に実行した場合は、ビルドプロセスにかかる時間が通常よりも長くなります。ビルドが完了すると、コマンドラインに結果が表示されます。
... Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.194 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ... [INFO] -------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] -------------------------------------------------------------- [INFO] Total time: 6.393 s ... [INFO] --------------------------------------------------------------- ビルド結果を見直して、ビルドが適切に実行したことを確認し、ファイルのエラーに対応します。
Red Hat Decision Manager で、新しいルールアセットを既存のプロジェクトと統合するには、新しい Maven プロジェクトをナレッジ JAR (kJAR) としてコンパイルし、Decision Central のプロジェクトの pom.xml ファイルに依存関係として追加します。