1. 概要

Drools は、ビジネスルール管理システム(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>

両方の依存関係の最新バージョンは、kie-ciおよびdrools-decisiontablesとしてMaven中央リポジトリーで入手できます。

3. Droolsの基本

Droolsの基本的な概念を見ていきます。

  • ファクト–ルールの入力として機能するデータを表します
  • ワーキングメモリ– ファクト、を備えたストレージで、パターンマッチングに使用され、変更、挿入、および削除が可能です。
  • Rule Factsを一致するアクションに関連付ける単一のルールを表します。 Drools RuleLanguageで.drlファイルに、またはデシジョンテーブルとしてExcelスプレッドシートに書き込むことができます。
  • ナレッジセッション–ルールの実行に必要なすべてのリソースを保持します。 すべてのファクトがセッションに挿入され、一致するルールが実行されます
  • ナレッジベース– Droolsエコシステムの知識を表し、ルールが見つかったリソースに関する情報を持ち、ナレッジセッションを作成します。
  • モジュール– モジュールは、異なるセッションを保持できる複数のナレッジベースを保持します

4. Java構成

特定のデータに対してルールを実行するには、フレームワークが提供するクラスを、ルールファイルの場所とファクト:に関する情報でインスタンス化する必要があります。

4.1. KieFileSystem

まず、 KieFileSystembeanを設定する必要があります。 これは、フレームワークによって提供されるメモリ内ファイルシステムです。 次のコードは、ルールファイル、デシジョンテーブルなどの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 は、ファイルシステム上のルールファイルの場所を示します。 ここでは、 classpath からファイルを読み取っています。これは、Mavenプロジェクトの場合は通常 / src / main /resourcesです。

4.2。KieContainer

次に、を設定する必要があります KieContainer これはすべてのプレースホルダーです KieBases 特に KieModule。 KieContainer を含む他の豆の助けを借りて構築されています KieFileSystem、KieModule、 KieBuilder。

The buildAll() で呼び出されるメソッド KieBuilder すべてのリソースを構築し、それらをに結び付けます 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

このルールは、 ApplicantおよびSuggestedRoleファクトをKieSession:に挿入することで実行できます。

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が提供するキーワードをいくつか使用しました。 それらの使用法を理解しましょう:

  • パッケージ–これはkmodule.xmlで指定するパッケージ名です。ルールファイルはこのパッケージ内にあります
  • import –これはJava import ステートメントに似ています。ここでは、KnowledgeSessionに挿入するクラスを指定する必要があります。
  • global – これは、セッションのグローバルレベル変数を定義するために使用されます。 これを使用して、入力パラメーターを渡したり、セッションの情報を要約するための出力パラメーターを取得したりできます。
  • 方言–方言は、条件セクションまたはアクションセクションの式で使用される構文を指定します。 デフォルトでは、方言はJavaです。 Droolsは方言mvelもサポートしています。 これは、Javaベースのアプリケーションの表現言語です。 フィールドとメソッド/ゲッターアクセスをサポートします
  • rule –これはルール名でルールブロックを定義します
  • when –これはルール条件を指定します。この例では、チェックされる条件はApplicantexperienceInYearsが10年以上でcurrentSalaryです。一定の範囲で
  • then – このブロックは、whenブロックの条件が満たされたときにアクションを実行します。 この例では、申請者の役割がマネージャーとして設定されています

5.2. デシジョンテーブル

デシジョンテーブルは、事前にフォーマットされたExcelスプレッドシートでルールを定義する機能を提供します。 Droolsが提供するデシジョンテーブルの利点は、技術者でない人でも理解しやすいことです。

また、同様のルールがあるが値が異なる場合に便利です。この場合、。 drl ファイルに新しいルールを書き込むのとは対照的に、Excelシートに新しい行を追加する方が簡単です。 製品タイプに基づいて製品にラベルを適用する例を使用して、デシジョンテーブルの構造を見てみましょう。

デシジョンテーブルはさまざまなセクションにグループ化されており、一番上のセクションは RuleSet を指定するヘッダーセクションのようなものです(つまり、 ルールファイルが配置されているパッケージ)、 Import (インポートされるJavaクラス)、および Notes (ルールの目的に関するコメント)。

ルールを定義する中央のセクションはRuleTableと呼ばれ、同じドメインオブジェクトに適用されるルールをグループ化します。

次の行には、列タイプCONDITIONACTIONがあります。 これらの列内で、1つの行に記載されているドメインオブジェクトのプロパティと、後続の行にあるそれらの値にアクセスできます。

ルールを実行するメカニズムは、.drlファイルで見たものと似ています。

テストを実行することにより、これらのルールを適用した結果を確認できます。

@Test
public void whenProductTypeElectronic_ThenLabelBarcode() {
    Product product = new Product("Microwave", "Electronic");
    product = productService.applyLabelToProduct(product);
    
    assertEquals("BarCode", product.getLabel());
}

6. 結論

この簡単な記事では、アプリケーションのビジネスルールエンジンとしてDroolsを利用する方法について説明しました。 また、Droolsルール言語でルールを記述したり、スプレッドシートで言語を理解しやすくしたりするための複数の方法を見てきました。

いつものように、この記事の完全なコードは、GitHubから入手できます。