Droolsの紹介
1概要
Drols
はビジネスルール管理システム(BRMS)ソリューションです。これは、ファクトを処理し、ルールおよびファクト処理の結果として出力を生成するルールエンジンを提供します。
ビジネスロジックの集中化により、迅速かつ安価に変更を導入することができます。
また、わかりやすい形式でルールを記述するための機能を提供することで、ビジネスチームとテクニカルチームの間のギャップを埋めます。
2 Mavenの依存関係
Droolsを使い始めるには、まず
pom.xml
にいくつかの依存関係を追加する必要があります。
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>7.1.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.1.0.Beta1</version>
</dependency>
両方の依存関係の最新版は、Maven Central Repositoryでhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.kie%22%20AND%20a%3A%22kie-として入手可能です。 ci%22[kie-ci]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.drools%22%20AND%20a%3A%22drools-decisiontables%22[drools-decisiontables]。
3ドロールの基本
Droolsの基本概念を見ていきます。
-
Facts
– ルールの入力として機能するデータを表します -
ワーキングメモリ
–
ファクトを持つストレージ、
はそれらが使用される場所
パターンマッチング。変更、挿入、削除が可能
Rule ** –
Facts
を関連付ける単一のルールを表します
アクションのマッチングそれはDrools Rule Languageで書くことができます。
.drl
ファイルまたはExcelスプレッドシートの
Decision Table
として
ナレッジセッション** – 発砲に必要なすべてのリソースを保持しています
ルールすべての
Facts
がセッションに挿入され、その後ルールが一致する
解雇されます
Knowledge Base ** – Droolsエコシステムの知識を表します。
それは
Rules
が見つかったリソースに関する情報を持っています。
また、
Knowledge Session
を作成します。
Module
– ** モジュールは、保持できる複数の知識ベースを保持します。
異なるセッション
4 Javaの設定
特定のデータに対してルールを起動するには、フレームワークが提供するクラスにルールファイルの場所と__Factsに関する情報をインスタンス化する必要があります。
4.1.
KieFileSystem
まず、
KieFileSystem
Beanを設定する必要があります。これはフレームワークによって提供されるインメモリファイルシステムです。次のコードは、ルールファイル、デシジョンテーブルなどのDroolsリソースをプログラムで定義するためのコンテナを提供します。
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(
ResourceFactory.newClassPathResource(
RULES__PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
ここで、
RULES
PATH__はファイルシステム上のルールファイルの場所を表します。
ここでは、Mavenプロジェクトの場合、
classpath
(通常は
/src/main/resources
)からファイルを読み取ります。
4.2.
KieContainer
次に、
KieContainer
を設定する必要があります。これは、特定の
KieModuleのすべての
KieBases
のプレースホルダーです。 KieContainer
は、
KieFileSystem、KieModule、
、__KieBuilderなどの他のBeanの助けを借りて構築されています。
KieBuilder
で呼び出された
buildAll()
メソッドは、すべてのリソースを構築し、それらを__KieBaseに関連付けます。これは、すべてのルールファイルを見つけて検証できる場合にのみ正常に実行されます。
public KieContainer kieContainer() throws IOException {
KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices()
.newKieBuilder(kieFileSystem())
.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
4.3.
KieSession
この規則は
KieSession
Beanを開くことによって起動されます。これは__KieContainerから取得できます。
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
5ルールの実装
これでセットアップは完了しました。次に、ルールを作成するためのいくつかのオプションを見てみましょう。
現在の給与と彼の経験年数に基づいて、申請者を特定の役割に分類する例を挙げて、ルールの実装を検討します。
5.1. Droolsルールファイル(
.drl
)
簡単に言うと、Droolsルールファイルにはすべてのビジネスルールが含まれています。
-
規則には
When-Then
構文** が含まれます。ここで、
When
セクションには確認する条件がリストされ、
Then
セクションに条件が満たされた場合に実行されるアクションがリストされます。
package com.baeldung.drools.rules;
import com.baeldung.drools.model.Applicant;
global com.baeldung.drools.model.SuggestedRole suggestedRole;
dialect "mvel"
rule "Suggest Manager Role"
when
Applicant(experienceInYears > 10)
Applicant(currentSalary > 1000000 && currentSalary <=
2500000)
then
suggestedRole.setRole("Manager");
end
このルールは、
KieSessionに
Applicant
および
SuggestedRole__ファクトを挿入することによって起動できます。
public SuggestedRole suggestARoleForApplicant(
Applicant applicant,SuggestedRole suggestedRole){
KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(applicant);
kieSession.setGlobal("suggestedRole",suggestedRole);
kieSession.fireAllRules();
//...
}
Applicant
インスタンスで2つの条件をテストしてから、両方の条件が満たされたことに基づいて
SuggestedRole
オブジェクトの
Role
フィールドを設定します。
これはテストを実行することで確認できます。
@Test
public void whenCriteriaMatching__ThenSuggestManagerRole(){
Applicant applicant = new Applicant("David", 37, 1600000.0,11);
SuggestedRole suggestedRole = new SuggestedRole();
applicantService.suggestARoleForApplicant(applicant, suggestedRole);
assertEquals("Manager", suggestedRole.getRole());
}
この例では、Droolsが提供するキーワードをほとんど使用していません。使い方を理解しましょう。
-
package –
これは、で指定したパッケージ名です。
kmodule.xml、
ルールファイルはこのパッケージ内にあります。
import ** – これはJavaのimportステートメントに似ています。
KnowledgeSession
に挿入しているクラスを指定します。
global – ** これはグローバル変数の定義に使われます。
セッション;これは、入力パラメータを渡したり、出力を取得するために使用できます。
セッションに関する情報を要約するためのパラメータ
dialect ** – 方言は、で使用されている構文を指定します。
条件セクションまたはアクションセクション内の式。デフォルトでは
方言はJavaです。 Droolsは方言
mvel
もサポートしています。それは式です
Javaベースのアプリケーション用の言語。それは分野を支えます
メソッド/ゲッターアクセス
rule ** – これは、ルール名を持つルールブロックを定義します。
-
when
– これはルール条件を指定します。この例では
チェックされる条件は、
応募者
経験
経験年数
一定の範囲内で10年以上経過した現在の給与
then – ** このブロックは、以下の条件が満たされるとアクションを実行します。
ブロックが出会ったとき。この例では、
Applicant__ロールはManagerとして設定されています。
5.2. 決定表
デシジョンテーブルは、フォーマット済みのExcelスプレッドシートにルールを定義する機能を提供します。 Droolsが提供するDecision Tableの利点は、技術者以外でも理解しやすいことです。
また、似たような規則があるが値が異なる場合にも便利です。この場合、.
drl
ファイルに新しい規則を記述するのとは対照的に、Excelシートに新しい行を追加する方が簡単です。商品タイプに基づいて商品にラベルを適用する例を使用した意思決定表の構造を見てみましょう。
デシジョンテーブルは異なるセクションにグループ分けされています。一番上のセクションは
RuleSet
(つまりルールファイルが配置されているパッケージ)、
Import
(インポートされるJavaクラス)、および
Notes
(ルールの目的に関するコメント)を指定するヘッダーセクションのようです。
-
ルールを定義する中心的なセクションは
RuleTable
と呼ばれ、同じドメインオブジェクトに適用されるルールをまとめたものです。
次の行には、列タイプ
CONDITION
と
ACTION
があります。これらの列内で、1行に記載されているドメインオブジェクトのプロパティとそれ以降の行のそれらの値にアクセスできます。
ルールを起動するメカニズムは、
.drl
ファイルで見たものと似ています。
テストを実行することで、これらの規則を適用した結果を検証できます。
@Test
public void whenProductTypeElectronic__ThenLabelBarcode() {
Product product = new Product("Microwave", "Electronic");
product = productService.applyLabelToProduct(product);
assertEquals("BarCode", product.getLabel());
}
6. 結論
この簡単な記事では、アプリケーションでビジネスルールエンジンとしてDroolsを利用することを検討しました。スプレッドシートの言語を理解しやすいように、Droolsのルール言語でルールを書くことができる複数の方法も見ました。
いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/drools[GitHubで利用可能]です。