网站首页 > java教程 正文
最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Drools这个开源引擎,发现其功能强大到超出我的预期。
规则引擎的应用很广泛,几乎所有的系统都可以使用规则引擎,将业务规则和业务系统实现代码解耦,规则单独存储在代码实现外。例如最常见的规则应用是商场或者电商的打折促销,满500减100,再满500打9.5折,并获得100积分,满1000积分可抵扣50元,这些复杂的规则如果硬编码到系统中,规则一旦变化就得对系统进行更新,而这些规则可能会根据双十一或春节、圣诞等不同时期有不同的需要,并且折扣、满减都会有不同。这个时候规则引擎可以做到只更新规则文件,不用更新整个业务系统,从而快速响应变化满足需求。
什么是Drools?它是由大名鼎鼎的JBoss公司开源的规则引擎系统,可以免费下载使用,现在已经发展到6.5版本,并且7.0RC版也已经可以下载使用了。它可以集成在JavaEE项目中进行使用,其下载地址如下:https://www.drools.org/download/download.html,进入下载地址后下载Drools Engine和Drools and jBPM tools两个压缩包在Eclipse中做好相应的配置后就可以进行开发了。
Eclipse开发环境的搭建,将Drools and JBPM tools压缩包解压后将目录\binaries\org.drools.updatesite目录中的plagins和features两个子目录copy到Eclipse的各目录下,这两个子目录中的内容会和Eclipse中对应的子目录中的内容合并,然后启动Eclipse,打开Window菜单下Preferences,会发现多了Drools项,然后对Drools进行配置,如下图:
再选择Drools Runtime将Drools Engine压缩包解压后的jar文件填加进去,如下图:
点击OK后,选择已经填加的Runtime,如下图:
做好这些配置后,重启Eclipse。然后新建项目,会发现项目类型中多了Drools类型,选择Drools Project,Next。
选择第二项,创建示例项目。
进入项目后项目结构如下:
其中com.sample中是针对三种规则文件的测试类,resources目录下对应三种规则定义文件,分别是Excel,drl和bpmn文件,kmodule.xml中存储的kbase和kession的描述,描述如下:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
<kbase name="dtables" packages="dtables">
<ksession name="ksession-dtables"/>
</kbase>
<kbase name="process" packages="process">
<ksession name="ksession-process"/>
</kbase>
</kmodule>
其中kbase的packages必须和项目中的报名一致,ksession的名字会在代码中用到,我们以drl规则文件为例看一下其怎么发挥作用的,drl规则文件对应的测试代码为DroolsTest,其规则文件定义如下:
package com.sample
import com.sample.Message;
rule "Hello World"
when
m : Message( status == Message.HELLO, myMessage : message )
then
System.out.println( myMessage );
m.setMessage( "Goodbye cruel world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
when
Message( status == Message.GOODBYE, myMessage : message )
then
System.out.println( myMessage );
end
其中package为自已定义的一段文字可以与代码中的不同,使用import引入需要进行规则验证的对象类型,Eclipse生成的代码是一个static类,其实可以是一个普通类,这里我们使用的对象类型为com.sample.Message,其中定义了两条规则分别为Hello World和GoodBye,其使用when 和then作为if then的表达(即如果怎样就怎样),其中rule "Hello World"中,在when短语中定义了一个Message对象m和获取Message属性message的myMessage变量,then语句总使用Message类中的方法对m对象的属性进行了更新,并使用update(m)的方式更新回了Java代码中,整个when的意思是对传入的Message对象m进行如下判断如果m.status==Message.HELLO,则执行then中的操作。
DroolsTest.java代码如下,main方法中前三行则是为了构造Kie对象,取得了kmodule.xml中名字为ksession-rules的session,通过kSession.insert(msg)传入需要进行规则验证的对象,通过kSession.fireAllRules()执行规则。
package com.sample;
import java.util.ArrayList;
import java.util.List;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
System.out.println(String.format("执行规则前message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));
Message message2=new Message();
message2.setMessage("liuyinghui");
message2.setStatus(Message.HELLO);
List<Message> listMsg= new ArrayList<Message>();
listMsg.add(message2);
listMsg.add(message);
for (Message msg : listMsg) {
kSession.insert(msg);
kSession.fireAllRules();
}
System.out.println(String.format("执行规则后message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));
} catch (Throwable t) {
t.printStackTrace();
}
}
}
Message.java的定义如下:
package com.sample;
public class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(int status) {
this.status = status;
}
}
运行结果如下图,可以看到经过规则引擎的处理前后后message对象的变化,中间测试规则文件执行时输出的一些属性值,至此一个简单的使用Drools规则引擎的程序就开发完毕了。
Drools 6.5 Final学习笔记
最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Drools这个开源引擎,发现其功能强大到超出我的预期。
什么是Drools?它是由大名鼎鼎的JBoss公司开源的规则引擎系统,可以免费下载使用,现在已经发展到6.5版本,并且7.0RC版也已经可以下载使用了。它可以集成在JavaEE项目中进行使用,其下载地址如下:https://www.drools.org/download/download.html,进入下载地址后下载Drools Engine和Drools and jBPM tools两个压缩包在Eclipse中做好相应的配置后就可以进行开发了。
Eclipse开发环境的搭建,将Drools and JBPM tools压缩包解压后将目录\binaries\org.drools.updatesite目录中的plagins和features两个子目录copy到Eclipse的各目录下,这两个子目录中的内容会和Eclipse中对应的子目录中的内容合并,然后启动Eclipse,打开Window菜单下Preferences,会发现多了Drools项,然后对Drools进行配置,如下图:
再选择Drools Runtime将Drools Engine压缩包解压后的jar文件填加进去,如下图:
点击OK后,选择已经填加的Runtime,如下图:
做好这些配置后,重启Eclipse。然后新建项目,会发现项目类型中多了Drools类型,选择Drools Project,Next。
选择第二项,创建示例项目。
进入项目后项目结构如下:
其中com.sample中是针对三种规则文件的测试类,resources目录下对应三种规则定义文件,分别是Excel,drl和bpmn文件,kmodule.xml中存储的kbase和kession的描述,描述如下:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
<kbase name="dtables" packages="dtables">
<ksession name="ksession-dtables"/>
</kbase>
<kbase name="process" packages="process">
<ksession name="ksession-process"/>
</kbase>
</kmodule>
其中kbase的packages必须和项目中的报名一致,ksession的名字会在代码中用到,我们以drl规则文件为例看一下其怎么发挥作用的,drl规则文件对应的测试代码为DroolsTest,其规则文件定义如下:
package com.sample
import com.sample.Message;
rule "Hello World"
when
m : Message( status == Message.HELLO, myMessage : message )
then
System.out.println( myMessage );
m.setMessage( "Goodbye cruel world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
when
Message( status == Message.GOODBYE, myMessage : message )
then
System.out.println( myMessage );
end
其中package为自已定义的一段文字可以与代码中的不同,使用import引入需要进行规则验证的对象类型,Eclipse生成的代码是一个static类,其实可以是一个普通类,这里我们使用的对象类型为com.sample.Message,其中定义了两条规则分别为Hello World和GoodBye,其使用when 和then作为if then的表达(即如果怎样就怎样),其中rule "Hello World"中,在when短语中定义了一个Message对象m和获取Message属性message的myMessage变量,then语句总使用Message类中的方法对m对象的属性进行了更新,并使用update(m)的方式更新回了Java代码中,整个when的意思是对传入的Message对象m进行如下判断如果m.status==Message.HELLO,则执行then中的操作。
DroolsTest.java代码如下,main方法中前三行则是为了构造Kie对象,取得了kmodule.xml中名字为ksession-rules的session,通过kSession.insert(msg)传入需要进行规则验证的对象,通过kSession.fireAllRules()执行规则。
package com.sample;
import java.util.ArrayList;
import java.util.List;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
System.out.println(String.format("执行规则前message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));
Message message2=new Message();
message2.setMessage("liuyinghui");
message2.setStatus(Message.HELLO);
List<Message> listMsg= new ArrayList<Message>();
listMsg.add(message2);
listMsg.add(message);
for (Message msg : listMsg) {
kSession.insert(msg);
kSession.fireAllRules();
}
System.out.println(String.format("执行规则后message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));
} catch (Throwable t) {
t.printStackTrace();
}
}
}
Message.java的定义如下:
package com.sample;
public class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(int status) {
this.status = status;
}
}
运行结果如下图,可以看到经过规则引擎的处理前后后message对象的变化,中间测试规则文件执行时输出的一些属性值,至此一个简单的使用Drools规则引擎的程序就开发完毕了。
- 上一篇: 规则引擎EasyRule实践(规则引擎 .net)
- 下一篇: 8大能力引擎 -流程引擎(流程级能力)
猜你喜欢
- 2024-10-07 8大能力引擎 -流程引擎(流程级能力)
- 2024-10-07 规则引擎EasyRule实践(规则引擎 .net)
- 2024-10-07 自定义搭建的工作流引擎系统一谈(工作流引擎框架对比)
- 2024-10-07 轻量级的java表达式引擎aviator,使用起来还是比较简单方便。
- 2024-10-07 SpringBoot系列——Activiti7工作流引擎
- 2024-10-07 自助搭建工作流的流程引擎梳理详解
- 2024-10-07 浅浅学习Spring下Drools规则引擎使用
- 2024-10-07 Java规则引擎2.1.8版本新增功能说明
- 2024-10-07 开源流程引擎camunda快速体验(开源流程引擎 工作流)
- 2024-10-07 Java规则引擎风控系统全套成品源代码
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)