Droolsの紹介

Droolsの概要

1. 概要

Droolsは、ビジネスルール管理システム(BRMS)ソリューションです。 ファクトを処理し、ルールとファクト処理の結果として出力を生成するルールエンジンを提供します。 ビジネスロジックの集中化により、変更を迅速かつ安価に導入できます。

また、理解しやすい形式でルールを作成する機能を提供することにより、ビジネスチームと技術チームのギャップを埋めます。

2. Mavenの依存関係

Droolsの使用を開始するには、最初にpom.xmlにいくつかの依存関係を追加する必要があります。


    org.kie
    kie-ci
    7.1.0.Beta1


    org.drools
    drools-decisiontables
    7.1.0.Beta1

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

3. Droolsの基本

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

  • Facts –ルールの入力として機能するデータを表します

  • Working Memoryは、パターンマッチングに使用され、変更、挿入、および削除できるFacts,のストレージです。

  • RuleFactsを一致するアクションに関連付ける単一のルールを表します。 Drools Rule Languageで.drlファイルに、またはDecision TableとしてExcelスプレッドシートに書き込むことができます。

  • Knowledge Session –ルールの実行に必要なすべてのリソースを保持します。すべてのFactsがセッションに挿入され、一致するルールが実行されます

  • Knowledge Base – Droolsエコシステムの知識を表し、Rulesが見つかったリソースに関する情報を持ち、Knowledge Sessionを作成します。

  • *Module* *–*モジュールは、異なるセッションを保持できる複数のナレッジベースを保持します

4. Java設定

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

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

次に、特定のKieModule. KieContainerのすべてのKieBasesのプレースホルダーであるKieContainerを設定する必要があります。これは、KieFileSystem, KieModule,KieBuilder.などの他のBeanを使用して構築されますs

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ルールファイルにはすべてのビジネスルールが含まれています。

A rule includes a When-Then construct、ここではWhenセクションにチェックする条件がリストされ、Thenセクションに条件が満たされた場合に実行するアクションがリストされます。

package com.example.drools.rules;

import com.example.drools.model.Applicant;

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

  • package –これは、kmodule.xml,で指定するパッケージ名です。ルールファイルはこのパッケージ内にあります。

  • import –これはJavaimportステートメントに似ています。ここでは、KnowledgeSessionに挿入するクラスを指定する必要があります。

  • global –これは、セッションのグローバルレベル変数を定義するために使用されます。これを使用して、入力パラメーターを渡したり、セッションの情報を要約するための出力パラメーターを取得したりできます。

  • dialect –方言は、条件セクションまたはアクションセクションの式で使用される構文を指定します。 デフォルトでは、方言はJavaです。 Droolsは方言mvelもサポートしています。これは、Javaベースのアプリケーションの表現言語です。 フィールドおよびメソッド/ゲッターアクセスをサポートします

  • rule –これはルール名でルールブロックを定義します

  • when –これはルール条件を指定します。この例では、チェックされる条件は、experienceInYearsが10年を超え、currentSalaryが特定の範囲にあるApplicantです。

  • then –このブロックは、whenブロックの条件が満たされたときにアクションを実行します。 この例では、Applicantロールがマネージャーとして設定されています

5.2. 決定表

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

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

image

デシジョンテーブルはさまざまなセクションにグループ化されており、一番上のセクションは、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ルール言語でルールを記述したり、スプレッドシートで言語を簡単に理解したりするための複数の方法を見てきました。

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