drools 학습 여행
먼저 우리의 장면을 말해 봅시다.
만약에 우리가 지금 사이트에 이벤트(추가 포인트 보상)를 개최하려고 한다면 이벤트 규칙은 다음과 같다.
규칙은 다음과 같다: 주문 원가 금액은
100이하, 가산점 없음
100-500 플러스 100점.
500-1000 플러스 500점.
1000점 이상, 1000점 추가.
우리는 이렇게 인코딩할 수 있다.
package com.league.drools.pojo;
import java.util.Date;
public class Order {
private Date bookingDate;//
private int amout;//
private User user;//
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public Date getBookingDate() {
return bookingDate;
}
public void setBookingDate(Date bookingDate) {
this.bookingDate = bookingDate;
}
public int getAmout() {
return amout;
}
public void setAmout(int amout) {
this.amout = amout;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
package com.league.drools.pojo;
public class User {
private String name;//
private int level;//
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
package com.league.drools.demo1;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.league.drools.pojo.Order;
import com.league.drools.pojo.User;
public class App {
public static void main(String[] args) throws Exception {
List<Order> orderList = getInitData();
for (int i=0; i<orderList.size(); i++){
Order order = orderList.get(i);
if (order.getAmout() <= 100){
order.setScore(0);
addScore(order);
}else if(order.getAmout() > 100 && order.getAmout() <= 500){
order.setScore(100);
addScore(order);
}else if(order.getAmout() > 500 && order.getAmout() <= 1000){
order.setScore(500);
addScore(order);
}else{
order.setScore(1000);
addScore(order);
}
}
}
private static void addScore(Order o){
System.out.println(" " + o.getUser().getName() + " : " + o.getScore());
}
private static List<Order> getInitData() throws Exception {
List<Order> orderList = new ArrayList<Order>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
{
Order order = new Order();
order.setAmout(80);
order.setBookingDate(df.parse("2015-07-01"));
User user = new User();
user.setLevel(1);
user.setName("Name1");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(200);
order.setBookingDate(df.parse("2015-07-02"));
User user = new User();
user.setLevel(2);
user.setName("Name2");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(800);
order.setBookingDate(df.parse("2015-07-03"));
User user = new User();
user.setLevel(3);
user.setName("Name3");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(1500);
order.setBookingDate(df.parse("2015-07-04"));
User user = new User();
user.setLevel(4);
user.setName("Name4");
order.setUser(user);
orderList.add(order);
}
return orderList;
}
}
실행 결과:
Name1 : 0
Name2 : 100
Name3 : 500
Name4 : 1000
그렇게
사용자의 수요가 변경될 때, 예를 들어 사용자 등급이 2 이상인 회원만 이 활동 자격을 누릴 수 있다.
그러면 이때 반드시 이전의 코드를 바꾸고if 전에 회원급의 판단을 덧붙인 다음에 개발, 테스트, 생산 배치를 하고 버전을 발표하는 절차를 밟아야 한다.
상인들이 자주 활동을 하면 우리의 제품은 이런 규칙의 변경으로 인해 새로운 버전을 발표하여 현재의 업무를 지원해야 한다.
이때 우리는 규칙 엔진(Drools)을 사용하여 이런 문제를 해결할 수 있다.
Drools는 자바를 기반으로 한 규칙 엔진으로 복잡하고 변화가 많은 규칙을 하드코딩에서 해방시키고 규칙 스크립트의 형식으로 파일, 데이터 등 미디어에 저장하여 규칙의 변경을 수정하지 않아도 되고 심지어 기계를 다시 시작하지 않아도 즉각 온라인 환경에서 효력을 발생시킬 수 있다.
OK, 관련 코드로 바로 올라가세요.
package com.league.drools.demo1;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.league.drools.pojo.Order;
import com.league.drools.pojo.User;
public class App1 {
/**
* :
* 100 ,
* 100-500 100
* 500-1000 500
* 1000 1000
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder.add(ResourceFactory.newClassPathResource("rules/point-rules.drl"), ResourceType.DRL);
if (builder.hasErrors()) {
System.out.println(" , :");
KnowledgeBuilderErrors kbuidlerErrors = builder.getErrors();
for (Iterator iter = kbuidlerErrors.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
return;
}
Collection<KnowledgePackage> packages = builder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(packages);
StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
List<Order> orderList = getInitData();
for (int i = 0; i < orderList.size(); i++) {
Order o = orderList.get(i);
session.insert(o);
session.fireAllRules();
// ,
addScore(o);
}
session.dispose();
}
private static void addScore(Order o){
System.out.println(" " + o.getUser().getName() + " : " + o.getScore());
}
private static List<Order> getInitData() throws Exception {
List<Order> orderList = new ArrayList<Order>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
{
Order order = new Order();
order.setAmout(80);
order.setBookingDate(df.parse("2015-07-01"));
User user = new User();
user.setLevel(1);
user.setName("Name1");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(200);
order.setBookingDate(df.parse("2015-07-02"));
User user = new User();
user.setLevel(2);
user.setName("Name2");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(800);
order.setBookingDate(df.parse("2015-07-03"));
User user = new User();
user.setLevel(3);
user.setName("Name3");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(1500);
order.setBookingDate(df.parse("2015-07-04"));
User user = new User();
user.setLevel(4);
user.setName("Name4");
order.setUser(user);
orderList.add(order);
}
return orderList;
}
}
package rules
import com.league.drools.pojo.Order
import com.league.drools.pojo.User
rule "zero"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout <= 100)
then
$s.setScore(0);
update($s);
end
rule "add100"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 100 && amout <= 500)
then
$s.setScore(100);
update($s);
end
rule "add500"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 500 && amout <= 1000)
then
$s.setScore(500);
update($s);
end
rule "add1000"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 1000)
then
$s.setScore(1000);
update($s);
end
실행 결과는 다음과 같습니다.
Name1 : 0
Name2 : 100
Name3 : 500
Name4 : 1000
활동 규칙을 변경하려면drl 파일만 변경하십시오.응용을 다시 시작하면 됩니다.
MAVEN 종속은 다음과 같습니다.
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>5.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>5.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.9</version>
</dependency>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Red Hat Decision Manager 규칙을 작성하는 방법을 알고 싶을 때 유용한 문서Red Hat Decision Manager에서 규칙을 구현할 때 사용하는 언어가 DRL(Drools Rule Language)입니다. 규칙을 작성하려면 이 DRL의 문법을 먼저 알아야 합니다. DRL로 쓰지 않아도...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.