1. 概要

Drools は、スプレッドシート形式でのビジネスルールの管理をサポートしています。

この記事では、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>

これらの依存関係の最新バージョンは、kie-ciおよびdrools-decisiontablesにあります。

3. Excelでルールを定義する

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

  • 3年以上の個人のお客様は15% d割引を受けられます
  • 3年未満の個人のお客様は5% d割引を受けられます
  • すべてのビジネス顧客は20% d割引を受けます

3.1. Excelファイル

Droolsに必要な特定の構造とキーワードに従って、Excelファイルを作成することから始めましょう。

 

簡単な例では、最も関連性の高いキーワードのセットを使用しました。

  • RuleSet –デシジョンテーブルの開始を示します
  • インポート–ルールで使用されるJavaクラス
  • RuleTable –一連のルールの始まりを示します
  • 名前–ルールの名前
  • CONDITION –入力データに対してチェックされる条件のコードスニペット。 ルールには少なくとも1つの条件が含まれている必要があります
  • ACTION –ルールの条件が満たされた場合に実行されるアクションのコードスニペット。 ルールには、少なくとも1つのアクションが含まれている必要があります。 この例では、CustomerオブジェクトでsetDiscountを呼び出しています。

さらに、ExcelファイルでCustomerクラスを使用しました。 それでは、今それを作成しましょう。

3.2. 顧客クラス

エクセルシートのCONDITIONSとACTIONからわかるように、入力データには Customer クラスのオブジェクトを使用しています(typeおよびyears)結果を保存します( 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クラスはへのアクセスを提供します すべてのKieビルドおよびランタイム機能。 いくつかのファクトリ、サービス、およびユーティリティメソッドを提供します。 それでは、最初に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コンポーネントを使用して、ルールを読み取り、実行しました。 最後に、結果を検証するためのテストケースを作成しました。

いつものように、この記事で使用されている例は、Githubプロジェクトにあります。