Excelファイルのルールを使用したよだれ
1. 概要
[.s1]#https://www.drools.org/[Drools] has support for managing business rules in a spreadsheet format. #
この記事では、Droolsを使用してExcelファイルを使用してビジネスルールを管理する簡単な例を紹介します。
2. Mavenの依存関係
必要なDrools依存関係をアプリケーションに追加しましょう。
org.kie
kie-ci
7.1.0.Beta2
org.drools
drools-decisiontables
7.1.0.Beta2
これらの依存関係の最新バージョンは、kie-ciおよびdrools-decisiontablesにあります。
3. Excelでルールを定義する
この例では、顧客のタイプと顧客としての年数に基づいて割引を決定するルールを定義しましょう。
-
3年を超える個人のお客様には15%の割引が適用されます
-
3年未満の個人のお客様には5%の割引が適用されます
-
すべての企業顧客は20%の割引を受けます
3.1. Excelファイル
Droolsに必要な特定の構造とキーワードに従ってexcel fileを作成することから始めましょう。
簡単な例では、最も関連性の高いキーワードセットを使用しました。
-
RuleSet –デシジョンテーブルの開始を示します
-
Import –ルールで使用されるJavaクラス
-
RuleTable –一連のルールの始まりを示します
-
Name –ルールの名前
-
CONDITION –入力データに対してチェックされる条件のコードスニペット。 ルールには少なくとも1つの条件を含める必要があります
-
ACTION –ルールの条件が満たされた場合に実行されるアクションのコードスニペット。 ルールには少なくとも1つのアクションを含める必要があります。 この例では、CustomerオブジェクトでsetDiscountを呼び出しています。
さらに、ExcelファイルでCustomerクラスを使用しました。 それでは、今それを作成しましょう。
3.2. Customerクラス
エクセルシートのCONDITIONSと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クラスはへのアクセスを提供します すべてのKieビルドおよびランタイム機能。 いくつかのファクトリ、サービス、およびユーティリティメソッドを提供します。 それでは、最初にKieServicesインスタンスを取得しましょう。
KieServices kieServices = KieServices.Factory.get();
KieServicesを使用して、KieFileSystem、KieBuilder、およびKieContainerの新しいインスタンスを作成します。
4.2. KieFileSystem
KieFileSystemは仮想ファイルシステムです。 Excelスプレッドシートを追加しましょう。
Resource dt
= ResourceFactory
.newClassPathResource("com/example/drools/rules/Discount.xls",
getClass());
KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);
4.3. KieBuilder
ここで、KieBuilderに渡すことにより、KieFileSystemのコンテンツを作成します。
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
正常にビルドされると、kmodule.xmlを含むKieModule (any 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/example/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/example/drools/rules/Discount.xls",
getClass());
DecisionTableProviderImpl decisionTableProvider
= new DecisionTableProviderImpl();
String drl = decisionTableProvider.loadFromResource(dt, null);
8. 結論
この記事では、Droolsを使用してExcelスプレッドシートのビジネスルールを管理する簡単な例を見てきました。 Excelファイルでルールを定義する際に使用される構造と最小限のキーワードセットを見てきました。 次に、Kieコンポーネントを使用してルールを読み取り、実行しました。 最後に、結果を検証するテストケースを作成しました。
いつものように、この記事で使用されている例はthe Github projectにあります。