Drools是一个基于java的开源规则引擎, 规则引擎基本都只有一个逻辑就可以解释清楚: when…then… 当达到什么条件的时候,触发某一个动作。 Drools是java项目中常用的规则引擎之一。
规则引擎的应用场景单一,但是用处很大。 例如在某个场景下 有100个方法都要修改数据库的某一张表数据,且修改后都要有一个动作,就是想某一个系统发送一条消息。 传统的解决方案中,需要100个方法中都调用一个发送方法, 假如100个方法分散在10个系统中, 就至少要修改十次。 如果使用规则引擎+canal的组合就可以轻松解决这个问题。 当数据库表的数据发生insert update的时候,发送MQ到规则引擎系统, 规则引擎系统根据规则发送MQ到其他系统即可。 即使以后系统中加入了别的insert也不用再重复的写send方法了。
Drools的基本使用:
- 代码工程结构
- maven引入包
<dependencies>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>6.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.5.0.Final</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- 创建kmodule.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="myAgeSession"/>
</kbase>
</kmodule>
- 创建一个测试对象UserBean
package www.wpz.dome;
public class UserBean {
public Integer age;
public String name;
public UserBean(String name, Integer age) {
this.age = age;
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
- 创建规则文件rule.drl
import www.wpz.dome.UserBean
dialect "mvel"
rule "age"
when
$user : UserBean(age<10 || age>60)
then
System.out.println("这个年龄太小,还是不太够。");
end
rule "name"
when
$user : UserBean(name.equals("maozedong"))
then
System.out.println("这个是皇帝!");
end
- 测试类代码:
import www.wpz.dome.UserBean;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class Test {
private static KieContainer container = null;
private KieSession statefulKieSession = null;
@org.junit.Test
public void test(){
KieServices kieServices = KieServices.Factory.get();
container = kieServices.getKieClasspathContainer();
statefulKieSession = container.newKieSession("myAgeSession");
UserBean user = new UserBean("maozedong",12);
statefulKieSession.insert(user);
statefulKieSession.fireAllRules();
statefulKieSession.dispose();
}
}
``
- 其中的rule文件可以细拆一下: target 规则文件、 filter 过滤文件、 send 触发文件。