Red Hat Training
A Red Hat training course is available for Red Hat Decision Manager
DRL ルールを使用したデシジョンサービスの作成
Red Hat Customer Content Services
brms-docs@redhat.com
概要
前書き
ビジネスルール開発者は、Decision Central で DRL (Drools Rule Language) デザイナーを使用してビジネスルールを定義できます。DRL ルールは、Decision Central におけるその他のルールアセットとは異なり、ガイド付きまたは表形式ではなく、フリーフォームの .drl
テキストファイルで直接定義できます。このような DRL ファイルは、プロジェクトのデシジョンサービスの中心となります。
前提条件
DRL ルールのチームおよびプロジェクトが Decision Central に作成されており、各アセットが、チームに割り当てられたプロジェクトに関連付けられています。詳細は『デシジョンサービスの使用ガイド』 を参照してください。
第1章 Red Hat Decision Manager におけるルール作成アセット
Red Hat Decision Manager は、デシジョンサービスにビジネスルールを作成するのに使用するアセットを提供します。ルール作成アセットはそれぞれ長所が異なるため、ゴールおよびニーズに適したアセットを 1 つ、または複数を組み合わせて使用できます。
デシジョンサービスでルールを作成する最適な方法を選択できるように、以下の表で、Decision Central のルール作成アセットを紹介します。
表1.1 Decision Central におけるルール作成アセット
アセット | 主な特徴 | ドキュメンテーション |
---|---|---|
ガイド付きデシジョンテーブル |
| |
アップロードしたデシジョンテーブル |
| |
ガイド付きルール |
| |
ガイド付きルールテンプレート |
| |
DRL ルール |
|
第2章 DRL ルール
DRL ルールは、.drl
テキストファイルに直接定義するビジネスルールです。このような DRL ファイルは、Decision Central の他のすべてのルールアセットが最終的にレンダリングされるソースとなります。DRL ファイルを Decision Central インターフェースで作成および管理したり、外部の Red Hat Developer Studio、Java オブジェクト、Maven アーキタイプを使用して作成したりできます。DRL ファイルには、最低限、ルールの条件 (when
) およびアクション (then
) を定義するルールを 1 つ以上追加できます。Decision Central の DRL デザイナーでは、Java、DRL、および XML の構文が強調表示されます。
DRL ルールに関連するデータオブジェクトはすべて、DRL ルールと同じ Decision Central プロジェクトパッケージに置く必要があります。同じパッケージのアセットはデフォルトでインポートされます。その他のパッケージの既存アセットは、DRL ルールを使用してインポートできます。
第3章 データオブジェクト
データオブジェクトは、作成するルールアセットの構成要素です。データオブジェクトは、プロジェクトで指定したパッケージに Java オブジェクトとして実装されているカスタムのデータタイプです。たとえば、データフィールド Name
、Address
、および Date of Birth
を使用して Person
オブジェクトを作成し、ローン申し込みルールに詳細な個人情報を指定できます。このカスタムのデータタイプは、アセットとデシジョンサービスがどのデータに基づいているかを指定します。
3.1. データオブジェクトの作成
定義するデータオブジェクトは、プロジェクトのルールアセットの構成要素を定義し、アセットとデシジョンサービスがどのデータに基づいているかを指定します。
手順
- Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Create New Asset → Data Object をクリックします。
一意の データオブジェクト 名を入力し、パッケージ を選択します。これにより、その他のルールアセットでもデータオブジェクトを利用できるようになります。同じパッケージに、同じ名前のデータオブジェクトを複数作成することはできません。指定するパッケージは、そのデータオブジェクトを必要とするルールアセットが割り当てられている、もしくはこれから割り当てるパッケージにする必要があります。
別のパッケージからのデータオブジェクトのインポートルールアセットのパッケージに、別のパッケージから既存のデータオブジェクトをインポートすることもできます。インポートするオブジェクトを選択するには、Project Explorer から (ガイド付きデシジョンテーブル、ガイド付きルールなどの) アセットパネルを展開し、特定のアセットを選択し、アセットデザイナーで Data Objects → New item に移動します。
- データオブジェクトを永続化するには、Persistable チェックボックスを選択します。永続型データオブジェクトは、JPA 仕様に準じてデータベースに保存できます。デフォルトの JPA は Hibernate です。
- OK をクリックします。
データオブジェクトデザイナーで add field をクリックして、Id 属性、Label 属性、Type 属性を使用するオブジェクトにフィールドを追加します。必須属性にはアスタリスク (*) マークが付いています。
- Id: フィールドの一意の ID を入力します。
- Label: (任意) フィールドのラベルを入力します。
- Type: フィールドのデータ型を入力します。
List: このチェックボックスを選択すると、このフィールドで、指定したタイプのアイテムを複数保持できるようになります。
図3.1 データオブジェクトへのデータフィールドの追加
Create をクリックして、新しいフィールドを追加します。Create and continue をクリックすると、新しいフィールドが追加され、別のフィールドを引き続き作成できます。
注記フィールドを編集するには、フィールド行を選択し、画面右側の general properties を使用します。
第4章 Decision Central における DRL ルールの作成
Decision Central で、プロジェクトに対して DRL ファイルを作成および管理できます。パッケージに作成またはインポートするデータオブジェクトに基づいて、各 DRL ファイルで、ルールの条件、アクション、そしてその他ルールに関連するコンポーネントを定義します。
手順
- Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Create New Asset → DRL file をクリックします。
参考となる DRL ファイル 名を入力し、適切な パッケージ を選択します。指定するパッケージは、必要なデータオブジェクトが割り当てられている、またはこれから割り当てるパッケージにする必要があります。
(Project Explorer の Domain Specific Language Definitions パネルで) DSL アセットをプロジェクトに定義している場合は、Use Domain Specific Language (DSL) を選択することもできます。このような DSL アセットが、DRL デザイナーで定義する条件およびアクションに対して利用可能なオブジェクトになります。
OK をクリックして、ルールアセットを作成します。
新しい DRL ファイルが、Project Explorer の DRL パネルに追加されます。Use Domain Specific Language (DSL) オプションを選択した場合は DSLR パネルに追加されます。この DRL ファイルを割り当てたパッケージは、ファイルの上部にリストされます。
-
DRL デザイナーの左パネルの Fact types リストで、ルールに必要なすべてのデータオブジェクトとデータオブジェクトフィールドがリストされていることを確認します (それぞれを展開します)。リストされていない場合は、DRL ファイルの
import
命令文を使用して、その他のパッケージから関連するデータオブジェクトをインポートするか、パッケージにデータオブジェクトを作成します。 データオブジェクトをすべて配置したら、DRL デザイナーの Editor タブに戻り、以下のいずれかのコンポーネントで DRL ファイルを定義します。
DRL ファイルのコンポーネント
package //automatic import function //optional query //optional declare //optional rule rule ...
-
package
: (自動) これは、DRL ファイルを作成し、パッケージを選択すると定義されます。 import
: このパッケージ、または DRL ファイルで使用するその他のパッケージのデータオブジェクトを指定します。パッケージとデータオブジェクトをpackage.name.object.name
形式で指定し、1 行につき 1 つインポートします。データオブジェクトのインポート
import mortgages.mortgages.LoanApplication;
function
: (任意) DRL ファイルのルールが使用する関数を指定します。関数は、ルールのソースファイルにセマンティックコードを追加します。関数は、特に、ルールのアクション (then
) 部分が繰り返し使用され、パラメーターだけがルールごとに異なる場合に便利です。DRL ファイルのルールで、関数を宣言したり、静的メソッドを関数としてインポートしたりして、ルールの アクション (then
) 部分に、名前を指定して関数を使用します。ルールに関数を宣言して使用 (オプション 1)
function String hello(String applicantName) { return "Hello " + applicantName + "!"; } rule "Using a function" when eval( true ) then System.out.println( hello( "James" ) ); end
ルールに関数をインポートして使用 (オプション 2)
import function my.package.applicant.hello; rule "Using a function" when eval( true ) then System.out.println( hello( "James" ) ); end
query
: (任意) DRL ファイルのルールに関連するファクトに対してデシジョンエンジンを検索するのに使用します。クエリーは、定義した条件セットを検索するため、when
またはthen
を指定する必要はありません。クエリー名は KIE ベースでグローバルとなるため、プロジェクトにあるその他のすべてのルールクエリーと重複しないようにする必要があります。クエリーの結果に戻るには、ksession.getQueryResults("name")
を使用して、従来のQueryResults
定義を構成します ("name"
はクエリー名)。これにより、クエリーの結果が返り、クエリーに一致したオブジェクトを取得できるようになります。DRL ファイルのルールに、クエリーと、クエリー結果パラメーターを定義します。ルールで、年齢が 21 歳未満の場合のクエリーと、その結果
query "people under the age of 21" person : Person( age < 21 ) end QueryResults results = ksession.getQueryResults( "people under the age of 21" ); System.out.println( "we have " + results.size() + " people under the age of 21" ); System.out.println( "These people are are under 21:" ); rule "Underage" when application : LoanApplication( ) Applicant( age < 21 ) then application.setApproved( false ); application.setExplanation( "Underage" ); end
declare
: (任意) DRL ファイルのルールが使用する新しいファクトタイプを宣言します。Red Hat Decision Manager のjava.lang
パッケージのデフォルトはObject
ですが、必要に応じて DRL ファイルに別のタイプを宣言することもできます。DRL ファイルにファクトタイプを宣言すると、Java などの低級言語でモデルを作成せず、デシジョンエンジンに直接新しいファクトモデルを定義するようになります。新しいファクトタイプの宣言および使用
declare Person name : String dateOfBirth : java.util.Date address : Address end rule "Using a declared type" when $p : Person( name == "James" ) then // Insert Mark, who is a customer of James. Person mark = new Person(); mark.setName("Mark"); insert( mark ); end
rule
: DRL ファイルで各ルールを定義します。ルールは、rule "name"
形式のルール名、ルールの動作 (salience
、no-loop
など) を定義する任意の属性、when
およびthen
定義が続きます。同じパッケージにルール名を重複させることはできません。ルールのwhen
部分には、アクションを実行する条件が含まれます。たとえば、銀行が、ローンの申し込みを 21 歳以上に限定した場合、「Underage」ルールのwhen
条件はApplicant( age < 21 )
になります。ルールのthen
部分には、ルールの条件が一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合、then
アクションはsetApproved( false )
になり、申込者の年齢条件を満たしていないためにローンの申し込みは承認されません。条件 (when
) およびアクション (then
) は、パッケージで利用可能なデータオブジェクトに基づいて、任意の制約、バインディングなどのサポートされる DRL 要素を持つ、定められている一連のファクトパターンで構成されます。このパターンは、定義したオブジェクトにルールがどのように影響するかを指定します。申込者の年齢制限に関するルール
rule "Underage" salience 15 dialect "mvel" when application : LoanApplication( ) Applicant( age < 21 ) then application.setApproved( false ); application.setExplanation( "Underage" ); end
少なくても、各 DRL ファイルに
package
コンポーネント、import
コンポーネント、rule
コンポーネントを指定する必要があります。他のすべてのコンポーネントは任意です。図4.1 必要なコンポーネントおよび任意のルール属性を持つ DRL ファイルのサンプル
-
- ルールのコンポーネントをすべて定義したら、DRL デザイナーの右上ツールバーで Validate をクリックし、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントを見直し、エラーが表示されなくなるまで妥当性確認を行います。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
DRL ルールに条件を追加する方法は 「DRL ルールへの WHEN 条件の追加」 を参照してください。
DRL ルールにアクションを追加する方法は 「DRL ルールへの THEN アクションの追加」 を参照してください。
4.1. DRL ルールへの WHEN 条件の追加
ルールの when
部分には、アクションを実行するのに必要な条件が含まれます。たとえば、銀行のローン申し込みに年齢制限 (21 歳以上) が必要な場合、「Underage」ルールの when
条件は Applicant( age < 21 )
となります。パッケージで利用可能なデータオブジェクトに基づいて、指定した一連のパターンおよび制約と、任意のバインディング、その他のサポートされる DRL 要素で構成されます。
前提条件
-
package
は DRL ファイルに定義されます。これは、ファイルの作成時に行われます。 -
ルールで使用したデータオブジェクトの
import
リストが、DRL ファイルのpackage
行の下に定義されます。データオブジェクトは、このパッケージ、または別の Decision Central パッケージから使用できます。 -
rule
名は、package
、import
、または DRL ファイル全体に適用されるその他の行の下に、rule "name"
という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salience
、no-loop
など) を定義する任意のルール属性は、ルール名の下、when
セクションの前に定義します。
手順
DRL デザイナーで、ルールに
when
を入力して、条件命令文を追加します。when
セクションは、ルールの条件を定義するファクトパターンで構成されますが、ファクトパターンが 1 つも追加されない場合もあります。when
セクションを空にすると、デシジョンエンジンでfireAllRules()
を呼び出すたびに、then
セクションのアクションが実行します。これは、デシジョンエンジンのステートを設定するルールを使用する場合に便利です。条件のないルール
rule "bootstrap" when // empty then // actions to be executed once insert( new Applicant() ); end // The above rule is internally rewritten as: rule "bootstrap" when eval( true ) then insert( new Applicant() ); end
一致させる最初の条件のパターンを入力し、任意で制約、バインディング、およびサポートされる DRL 要素を入力します。基本的なパターンフォーマットは
patternBinding : patternType ( constraints )
です。パターンは、パッケージで利用可能なデータオブジェクトに基づいており、then
セクションのアクションを発生させるのに必要な条件を定義します。単純なパターン: 制約のない単純なパターンは、指定したタイプのファクトに一致します。たとえば、次は、申込者が存在することだけが条件になります。
when Applicant( )
制約のあるパターン: 制約を持つパターンは、指定したタイプのファクトと、追加制限を括弧で指定したパターン (true または false) に一致します。たとえば、次は、申込者が 21 歳に満たないことを条件としています。
when Applicant( age < 21 )
Pattern with binding: パターンのバインディングは簡単な参照となり、ルールのその他のコンポーネントが、定義したバターンに戻って参照します。たとえば、次の例で、
LoanApplication
のバインディングa
が、underage の申込者に関連するアクションとして使用されます。when a : LoanApplication( ) Applicant( age < 21 ) then a.setApproved( false ); a.setExplanation( "Underage" )
引き続き、このルールに適用する条件パターンをすべて定義します。以下は、DRL 条件を定義するいくつかのキーワードオプションです。
and
: 条件コンポーネントを論理積に分類します。接中辞および接頭辞のand
がサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべてand
と結合します。a : LoanApplication( ) and Applicant( age < 21 ) a : LoanApplication( ) and Applicant( age < 21 ) a : LoanApplication( ) Applicant( age < 21 ) // All of the above are the same.
or
: 条件コンポーネントを論理和に分類します。接中辞および接頭辞のor
がサポートされます。( Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 ) ) Bankruptcy( amountOwed == 100000 ) or IncomeSource( amount == 20000 )
exists
: 存在すべきファクトおよび制約を指定します。これは、ファクトが存在していることを示しているのではなく、ファクトが存在すべきであることを示しています。このオプションは、最初に一致したものだけが適用され、その後一致するものは無視されます。exists (Bankruptcy( yearOfOccurrence > 1990 || amountOwed > 10000 ))
not
: 存在するべきでないファクトおよび制約を指定します。not (Applicant( age < 21 ))
forall
: 最初のパターンに一致したすべてのファクトが残りのパターンに一致する制約を作成します。forall( app : Applicant( age < 21 ) Applicant( this == app, status = 'underage' ) )
from
: 条件パターンによりデータが一致するソースを指定します。Applicant( ApplicantAddress : address ) Address( zipcode == "23920W" ) from ApplicantAddress
entry-point
: パターンのデータソースに対応するエントリーポイントを定義します。通常はfrom
とともに使用します。Applicant( ) from entry-point "LoanApplication"
collect
: 構成を条件の一部として使用できる、オブジェクトのコレクションを定義します。この例では、指定した各担保に対して、デシジョンエンジンで保留されているすべての申し込みがArrayLists
に分類されます。申し込みが 3 つ以上ある場合は、このルールが実行します。m : Mortgage() a : ArrayList( size >= 3 ) from collect( LoanApplication( Mortgage == m, status == 'pending' ) )
accumulate
: オブジェクトのコレクションを処理し、各要素のカスタムアクションを実行し、(制約がtrue
と評価されると) 結果オブジェクトを 1 つ以上返します。このオプションは、collect
よりも強力で、柔軟性が高いオプションです。accumulate( <source pattern>; <functions> [;<constraints>] )
形式を使用します。この例では、min
、max
、およびaverage
は累積関数で、各センサーのすべての測定値から、最低気温、最高気温、そして平均気温の値を計算します。その他のサポートされる関数には、count
、sum
、variance
、standardDeviation
、collectList
、およびcollectSet
があります。s : Sensor() accumulate( Reading( sensor == s, temp : temperature ); min : min( temp ), max : max( temp ), avg : average( temp ); min < 20, avg > 70 )
高度な DRL オプションこれは、条件を定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインの『Drools ドキュメンテーション』を参照してください。
- ルールの条件コンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントを見直し、エラーが表示されなくなるまで妥当性確認を行います。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
4.2. DRL ルールへの THEN アクションの追加
ルールの then
部分には、ルールの条件部分に一致したときに実行するアクションが含まれます。たとえば、ローンの申込者が 21 歳に満たない場合は、「Underage」ルールの then
アクションが setApproved( false )
となり、年齢が基準に達していないためローンの申し込みが承認されません。アクションは、ルールの条件と、パッケージで利用可能オブジェクトに基づいて結果を実行します。
前提条件
-
package
は DRL ファイルに定義されます。これは、ファイルの作成時に行われます。 -
ルールで使用したデータオブジェクトの
import
リストが、DRL ファイルのpackage
行の下に定義されます。データオブジェクトは、このパッケージ、または別の Decision Central パッケージから使用できます。 -
rule
名は、package
、import
、または DRL ファイル全体に適用されるその他の行の下に、rule "name"
という形式で定義されます。同じパッケージでルール名を重複させることはできません。ルールの動作 (salience
、no-loop
など) を定義する任意のルール属性は、ルール名の下、when
セクションの前に定義します。
手順
-
DRL デザイナーで、ルールの
when
セクションの後にthen
を入力して、アクション命令文を追加します。 ルールの条件に基づいて、ファクトパターンに対して実行するアクションを 1 つ以上入力します。
次は、DRL アクションを定義するキーワードオプションの例です。
and
: アクションコンポーネントを論理積に分類します。接中辞および接頭辞のand
がサポートされます。デフォルトでは、結合演算子を指定しないと、リストされている条件またはアクションがすべてand
と結合します。application.setApproved ( false ) and application.setExplanation( "has been bankrupt" ); application.setApproved ( false ); and application.setExplanation( "has been bankrupt" ); application.setApproved ( false ); application.setExplanation( "has been bankrupt" ); // All of the above are the same.
set
: フィールドの値を設定します。application.setApproved ( false ); application.setExplanation( "has been bankrupt" );
modify
: ファクトに対して修正するフィールドを指定し、変更をデシジョンエンジンに通知します。modify( LoanApplication ) { setAmount( 100 ) }
update
: フィールドと、修正される関連ファクト全体を指定して、その変更をデシジョンエンジンに通知します。ファクトが変更したら、アップデートした値の影響を受ける可能性がある別のファクトを変更する前に、update
を呼び出す必要があります。modify
キーワードには、この追加手順がありません。update( LoanApplication ) { setAmount( 100 ) }
delete
: デシジョンエンジンからオブジェクトを削除します。キーワードretract
も DRL デザイナーでサポートされ、同じアクションを実行しますが、キーワードinsert
との一貫性を保つためにdelete
が好まれます。delete( LoanApplication );
insert
:新しい
ファクトを挿入し、ファクトに必要な結果フィールドと値を定義します。insert( new Applicant() );
insertLogical
:新しい
ファクトをデシジョンエンジンに論理的に挿入し、ファクトに必要な結果フィールドと値を追加します。Red Hat Decision Manager のデシジョンエンジンは、ファクトの挿入および取り消しに対して論理的な決断を行います。定期的な挿入、または指定した挿入の後に、ファクトを明示的に取り消す必要があります。論理挿入の後に、ファクトをアサートした条件が TRUE ではなくなると、ファクトは自動的にに取り消されます。insertLogical( new Applicant() );
高度な DRL オプションこれは、アクションを定義する基本的なキーワードオプションおよびパターン構築の例です。さらに高度な DRL オプションと構文が DRL デザイナーでサポートされています。オンラインの『Drools ドキュメンテーション』を参照してください。
- ルールのアクションコンポーネントをすべて定義したら、DRL デザイナーの右上のツールバーの Validate をクリックして、DRL ファイルの妥当性を確認します。ファイルの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、DRL ファイルの構文およびコンポーネントを見直し、エラーが表示されなくなるまで妥当性確認を行います。
- DRL デザイナーで Save をクリックして、設定した内容を保存します。
4.2.1. ルールの属性
ルール属性は、ルールの動作を修正するビジネスルールを指定する追加設定です。次の表では、ルールに割り当て可能な属性の名前と、対応する値を紹介します。
表4.1 ルールの属性
属性 | 値 |
---|---|
|
ルールの優先順位を定義する整数。ルールの salience 値を高くすると、アクティベーションキューに追加したときの優先順位が高くなります。
例: |
|
ブール値。このオプションを選択すると、ルールが有効になります。このオプションを選択しないと、ルールは無効になります。
例: |
|
日付定義および時間定義を含む文字列。現在の日時が
例: |
|
日時定義を含む文字列。現在日時が
例: |
|
ブール値。このオプションを設定すると、以前一致した条件がこのルールにより再トリガーとなる場合に、このルールを再度アクティブにする (ループする) ことができません。条件を選択しないと、この状況でルールがループされます。
例: |
|
ルールを割り当てるアジェンダグループを指定する文字列。アジェンダグループを使用すると、アジェンダをパーティションで区切り、ルールのグループに対する実行をさらに制御できます。フォーカスを取得したアジェンダグループのルールだけがアクティブになります。
例: |
|
ルールを割り当てるアクティベーション (または XOR) グループを指定する文字列。アクティベーショングループでは、ルールを 1 つだけアクティブにできます。発生する最初のルールが、アクティベーショングループの中で、アクティベーションが保留されているルールをすべてキャンセルします。
例: |
|
ルールの条件が一致している場合に、ルールがアクティブになってからの時間をミリ秒で定義する長整数値。
例: |
|
ルールのスケジュールに対する
例: |
|
ルールのスケジュールを指定する Quartz カレンダーの定義。
例: |
|
アジェンダグループ内のルールにのみ適用可能なブール値。このオプションが選択されている場合は、次にルールがアクティブになった場合に、そのルールが割り当てられたアジェンダグループにフォーカスが自動的に指定されます。
例: |
|
ルールフローグループまたはアジェンダグループ内のルールにのみ適用可能なブール値。このオプションを選択すると、次回、ルールのルールフローグループがアクティブになるか、ルールのアジェンダグループがフォーカスを受け取ると、(ルールフローグループがアクティブでなくなるか、アジェンダグループがフォーカスを失うまで) ルールをアクティブにすることができません。これは、
例: |
|
ルールフローグループを指定する文字列。ルールフローグループで、関連するルールフローによってそのグループがアクティブになった場合に限りルールを発行できます。
例: |
|
ルールのコード表記に使用される言語を指定する文字列 (
例: |
第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 → Run Configurations に移動して Java Application を右クリックし、New をクリックします。次に、Main タブで、Project と、関連する Main class を参照して選択します。Apply をクリックし、Run をクリックしてプロジェクトをテストします。再度プロジェクトフォルダーを右クリックすると、Java Application オプションが表示されます。
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.java
my-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!"); end
my-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
ファイルに依存関係として追加します。
第6章 次のステップ
付録A バージョン情報
Documentation last updated on: Monday, October 1, 2018.