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で利用可能]です。