初始规则引擎Drools

规则引擎drools6.x和之前的版本变化很大,对规则引擎研究尚浅,对其中实现原理以及框架的具体结构不够了解,留着以后试着去慢慢研究,只是记录一下自己在实际中的应用。
第一步我们创建一个工厂类,这个类来创建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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值