1概要

この記事では、Droolsを使用してExcelファイルを使用してビジネスルールを管理する簡単な例を紹介します。


2 Mavenの依存関係

必要なDroolsの依存関係をアプリケーションに追加しましょう。

<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-ci</artifactId>
    <version>7.1.0.Beta2</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>7.1.0.Beta2</version>
</dependency>

これらの依存関係の最新版は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 Excelでルールを定義する

この例では、顧客の種類と顧客としての年数に基づいて割引を決定するためのルールを定義しましょう。

  • 3年以上の個人顧客は15%の割引を受けます

  • 3年未満の個人顧客は5%の割引を受けます

  • すべてのビジネス顧客は20%の割引を受けます


3.1. Excelファイル

特定の構造に従ってhttps://github.com/eugenp/tutorials/tree/master/drools/src/main/resources/com/baeldung/drools/rules/Discount.xls[excelファイル]を作成することから始めましょうDroolsに必要なキーワード:

リンク:/uploads/Drools__Excel.png%201176w[]

簡単な例として、最も関連性の高いキーワードを使用しました。


  • RuleSet

    – デシジョンテーブルの先頭を示します


  • Import

    – ルールで使用されるJavaクラス


  • RuleTable

    – 一連のルールの始まりを示します


  • Name

    – ルールの名前


  • CONDITION

    – チェック対象の条件のコードスニペット

入力データルールには少なくとも1つの条件を含める必要があります
**

ACTION

– 次の場合に実行されるアクションのコードスニペット

ルールの条件が満たされている。ルールには少なくとも1つのアクションを含める必要があります。この例では、

Customer

オブジェクトに対して

setDiscount

を呼び出しています。

さらに、Excelファイルでは

Customer

クラスを使用しました。それでは、今作成しましょう。


3.2.

顧客

クラス

ExcelシートのCONDITIONとACTIONからわかるように、入力データ(

type



years

)に

Customer

クラスのオブジェクトを使用し、結果を格納する(

discount

)。


Customer

クラス:

public class Customer {
    private CustomerType type;

    private int years;

    private int discount;

   //Standard getters and setters

    public enum CustomerType {
        INDIVIDUAL,
        BUSINESS;
    }
}


4.


Droolsルールエンジンインスタンスの作成

定義したルールを実行する前に、Droolsルールエンジンのインスタンスを操作する必要があります。そのためには、Kieコアコンポーネントを使用する必要があります。


4.1.

KieServices


KieServices kieServices = KieServices.Factory.get();

KieServicesを使用して、

KieFileSystem



KieBuilder

、および

KieContainer

の新しいインスタンスを作成します。


4.2.

KieFileSystem



KieFileSystem

は仮想ファイルシステムです。 Excelスプレッドシートを追加しましょう。

Resource dt
  = ResourceFactory
    .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
      getClass());

KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);


4.3.

KieBuilder


次に、

KieFileSystem

の内容を

KieBuilder

に渡して、内容を構築します。

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();

正常に構築された場合、

__KieModuleが作成されます(その中にkmodule.xmlが含まれるMavenが作成したすべてのjarファイルは、

KieModule__です)。


4.4.

KieRepository


フレームワークは自動的に

KieModule

(ビルドの結果)を

KieRepository

に追加します。

KieRepository kieRepository = kieServices.getRepository();


4.5.

KieContainer



ReleaseId

を使用して、この

KieModule

で新しい

KieContainer

を作成することが可能になりました。この場合、Kieはデフォルトの

ReleaseId:

を割り当てます。

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer
  = kieServices.newKieContainer(krDefaultReleaseId);


4.6.

KieSession



KieContainer

から

KieSession

を取得できます。私たちのアプリケーションは

KieSession

とやり取りします。これはランタイムデータを保存し実行します。

KieSession kieSession = kieContainer.newKieSession();


5ルールを実行する

最後に、入力データを提供して規則を実行する時が来ました。

Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);

kieSession.fireAllRules();


6. テストケース

テストケースをいくつか追加しましょう。

public class DiscountExcelIntegrationTest {

    private KieSession kSession;

    @Before
    public void setup() {
        Resource dt
          = ResourceFactory
            .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
              getClass());
        kSession = new DroolsBeanFactory().getKieSession(dt);
    }

    @Test
    public void
      giveIndvidualLongStanding__whenFireRule__thenCorrectDiscount()
        throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 15);
    }

    @Test
    public void
      giveIndvidualRecent__whenFireRule__thenCorrectDiscount()
      throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 5);
    }

    @Test
    public void
      giveBusinessAny__whenFireRule__thenCorrectDiscount()
        throws Exception {
        Customer customer = new Customer(CustomerType.BUSINESS, 0);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 20);
    }
}


7. トラブルシューティング

Droolsはデシジョンテーブルを

DRL

に変換します。そのため、Excelファイル内のエラーや入力ミスを処理するのは難しい場合があります。多くの場合、エラーはDRLの内容を参照しています。そのため、トラブルシューティングを行うために、DRLを印刷して分析することが役立ちます。

Resource dt
  = ResourceFactory
    .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
      getClass());

DecisionTableProviderImpl decisionTableProvider
  = new DecisionTableProviderImpl();

String drl = decisionTableProvider.loadFromResource(dt, null);


8結論

この記事では、Droolsを使用してExcelスプレッドシートのビジネスルールを管理する簡単な例を紹介しました。 Excelファイルでルールを定義する際に使用するキーワードの構造と最小限のセットについて説明しました。次に、Kieコンポーネントを使用してルールを読み、実行しました。

最後に、結果を検証するためにテストケースを書きました。

いつものように、この記事で使用した例はhttps://github.com/eugenp/tutorials/tree/master/logging-modules/log-mdc[the Github project]にあります。