规则引擎drools6.x和之前的版本变化很大,对规则引擎研究尚浅,对其中实现原理以及框架的具体结构不够了解,留着以后试着去慢慢研究,只是记录一下自己在实际中的应用。
第一步我们创建一个工厂类,这个类来创建KieSession和StatelessKieSession对象。这两个对象是我们可以处理我们定义好的规则。现阶段我们只要认为这两个对象是根据我们的规则文件来创建。
第二步定义规则文件,规则文件是*.drl格式,规则文件有自己的具体语法和关键词,我们通过查看drools的API来进行详细的了解。建议将规则文件定义到类路径下面。
第三步来创建两个JavaBean对象,这是我们上面规则文件中引用的两个对象。
这里我们初次使用StatelessKieSession来调用我们的规则
第一步我们创建一个工厂类,这个类来创建KieSession和StatelessKieSession对象。这两个对象是我们可以处理我们定义好的规则。现阶段我们只要认为这两个对象是根据我们的规则文件来创建。
package com.sun.util;
import org.drools.core.event.DebugRuleRuntimeEventListener;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Message;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.StatelessKieSession;
public class KieSessionFactory {
private static KieSession kieSession;
private KieSessionFactory() {
}
/**
*
* @title disposeKieSession
* @description TODO (清空对象)
* @return void
*/
public static void disposeKieSession() {
if (kieSession != null) {
kieSession.dispose();
kieSession = null;
}
}
/**
*创建KieSession对象
*/
public static KieSession newKieSession(String classPath) throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
Resource resource = kieServices.getResources().newClassPathResource(classPath);
resource.setResourceType(ResourceType.DRL);
kfs.write(resource);
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) {
throw new Exception();
}
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kBase = kieContainer.getKieBase();
KieSession kieSession = kBase.newKieSession();
kieSession.addEventListener(new DebugRuleRuntimeEventListener());
return kieSession;
}
/**
*创建StatelessKieSession
*/
public static StatelessKieSession newStatelessKieSession(String classPath) throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
Resource resource = kieServices.getResources().newClassPathResource(classPath);
resource.setResourceType(ResourceType.DRL);
kfs.write(resource);
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) {
throw new Exception();
}
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kBase = kieContainer.getKieBase();
StatelessKieSession kiesession = kBase.newStatelessKieSession();
return kiesession;
}
}
第二步定义规则文件,规则文件是*.drl格式,规则文件有自己的具体语法和关键词,我们通过查看drools的API来进行详细的了解。建议将规则文件定义到类路径下面。
package com.company.license
//list any import classes here.
import bean.Applicant;
import bean.Application;
//declare any global variables here
rule "Is of valid age"
salience 1
lock-on-active true
when
a: Applicant( age < 18 )
then
a.setValid(false);
end
rule "pass valid age"
salience 1
lock-on-active true
when
a: Applicant( age >= 18 )
then
a.setValid(true);
end
rule "Application was made this year"
when
$a : Application( dateApplied > "01-jan-2009" )
then
$a.setValid( false );
end
第三步来创建两个JavaBean对象,这是我们上面规则文件中引用的两个对象。
public class Applicant {
private String name;
private int age;
private boolean valid;
public Applicant() {
}
public Applicant(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
}
public class Application {
private Date dateApplied;
private boolean valid;
public Date getDateApplied() {
return dateApplied;
}
public void setDateApplied(Date dateApplied) {
this.dateApplied = dateApplied;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
}
这里我们初次使用StatelessKieSession来调用我们的规则
KieServices kieServices = KieServices.Factory.get();
StatelessKieSession kSession = KieSessionFactory.newStatelessKieSession("resources/test.drl");
Applicant applicant = new Applicant("Mr John Smith", 16);
Application application = new Application();
/**
* 多个对象
*/
kSession.execute(Arrays.asList(new Object[] { application, applicant }));
if (applicant.isValid()) {
System.out.println("pass");
} else {
System.out.println("pass denied");
}
System.out.println(application.isValid());
KieCommands kieCommands = kieServices.getCommands();
@SuppressWarnings("rawtypes")
List<Command> cmds = new ArrayList<Command>();
cmds.add(kieCommands.newInsert(new Applicant("Mr John Smith", 19), "mrSmith", true, null));
ExecutionResults results = kSession.execute(kieCommands.newBatchExecution(cmds));
applicant = (Applicant) results.getValue("mrSmith");
System.out.println(applicant.isValid());