Excelファイルのルールを使用したよだれ
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プロジェクトにあります。