第一步我们创建一个工厂类,这个类来创建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());