drools 학습 여행

10993 단어 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>

 
 
 

좋은 웹페이지 즐겨찾기