筆者:松田 絵里奈
「Red Hat Decision Manager」は、OSSの「Drools」がベースのルールエンジンです。同製品で業務ロジックを実装することで、アプリから業務ロジックを分離でき、メンテナンスが容易になります。また、複雑なロジックでも簡単で分かりやすい形式で記述できます。
シェルスクリプトマガジン Vol.65は以下のリンク先でご購入できます。![]()
![]()
図11 pom.xml(抜粋)
(略)
<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)
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)
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ファイル
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クラス
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 追加するルール
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 さらに追加するルール
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