筆者:松田 絵里奈
「Red Hat Decision Manager」は、OSSの「Drools」がベースのルールエンジンです。同製品で業務ロジックを実装することで、アプリから業務ロジックを分離でき、メンテナンスが容易になります。また、複雑なロジックでも簡単で分かりやすい形式で記述できます。
シェルスクリプトマガジン Vol.65は以下のリンク先でご購入できます。
図11 pom.xml(抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(略) <dependencies> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> </dependency> </dependencies> (略) |
図12 過去利用状況ファクト(過去利用状況.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.example.rhdm; public class 過去利用状況 { private String ユーザーID; private int 過去利用回数; private int 過去利用額計; public String get ユーザーID() { return ユーザーID; } public void set ユーザーID(String ユーザーid) { ユーザーID = ユーザーid; } public int get 過去利用回数() { return 過去利用回数; } public void set 過去利用回数(int 過去利用回数) { this.過去利用回数 = 過去利用回数; } public int get 過去利用額計() { return 過去利用額計; } public void set 過去利用額計(int 過去利用額計) { this.過去利用額計 = 過去利用額計; } } |
図13 今回利用ファクト(今回利用.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package com.example.rhdm; public class 今回利用 { private String ユーザーID; private int 利用額; private String 割引ランク; private int 割引率; public String get ユーザーID() { return ユーザーID; } public void set ユーザーID(String ユーザーid) { ユーザーID = ユーザーid; } public int get 利用額() { return 利用額; } public void set 利用額(int 利用額) { this.利用額 = 利用額; } public String get 割引ランク() { return 割引ランク; } public void set 割引ランク(String 割引ランク) { this.割引ランク = 割引ランク; } public int get 割引率() { return 割引率; } public void set 割引率(int 割引率) { this.割引率 = 割引率; } } |
図14 最初の/src/main/resources/割引決定.drlファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.example.rhdm import com.example.rhdm.* dialect "java" rule "利用回数2回未満、利用額1万未満" when $過去利用:過去利用状況(過去利用回数 < 2, 過去利用額計 < 10000) $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID) then // modify($今回利用) {set 割引ランク("X")} $今回利用.set 割引ランク("X"); System.out.println($今回利用.get ユーザーID() + "の割引ランクは" + $今回利用.get 割引ランク() + "です"); end |
図16 ルールを動かすためのJavaクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package com.example.rhdm; import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public class DrlTest { public static final void main(String[] args) { try { KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); // 実行対象ルールを指定 KieSession kSession = kContainer.newKieSession("ksession-rules"); // ファクトを生成 過去利用状況 fact1 = new 過去利用状況(); fact1.setユーザーID("A001"); fact1.set過去利用回数(1); fact1.set過去利用額計(5000); 今回利用 fact2 = new 今回利用(); fact2.setユーザーID("A001"); // ルールエンジンにファクトをインサート kSession.insert(fact1); kSession.insert(fact2); // ルール実行 kSession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } } |
図17 追加するルール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
rule "利用回数2回未満、利用額1万以上" when $過去利用:過去利用状況(過去利用回数 < 2, 過去利用額計 >= 10000) $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID) then $今回利用.set割引ランク("E"); System.out.println($今回利用.getユーザーID() + "の割引ランクは"+ $今回利用.get割引ランク() + "です"); end rule "利用回数2回以上5回未満、利用額1万未満" when $過去利用:過去利用状況(過去利用回数 >= 2, 過去利用回数 < 5, 過去利用額計 < 10000) $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID) then $今回利用.set割引ランク("E"); System.out.println($今回利用.getユーザーID() + "の割引ランクは"+ $今回利用.get割引ランク() + "です"); end rule "利用回数2回以上5回未満、利用額1万以上" when $過去利用:過去利用状況(過去利用回数 >= 2, 過去利用回数 < 5, 過去利用額計 >= 10000) $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID) then $今回利用.set割引ランク("D"); System.out.println($今回利用.getユーザーID() + "の割引ランクは"+ $今回利用.get割引ランク() + "です"); end |
図18 さらに追加するルール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
rule "割引ランクX割引率設定" when $今回利用:今回利用(割引ランク == "X") then $今回利用.set割引率(0); System.out.println($今回利用.getユーザーID() + "の割引率は"+ $今回利用.get割引率() + "です"); end rule "割引ランクE割引率設定" when $今回利用:今回利用(割引ランク == "E") then $今回利用.set割引率(3); System.out.println($今回利用.getユーザーID() + "の割引率は"+ $今回利用.get割引率() + "です"); end rule "割引ランクD割引率設定" when $今回利用:今回利用(割引ランク == "D") then $今回利用.set割引率(5); System.out.println($今回利用.getユーザーID() + "の割引率は"+ $今回利用.get割引率() + "です"); end |