中文网站:http://www.drools.org.cn/category/install
本demo基于springboot2.0,drools 7.14.0.final
maven 依赖
<dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.14.0.Final</version></dependency><dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>7.14.0.Final</version></dependency>
进行配置drools
import org.kie.api.KieBase;import org.kie.api.KieServices;import org.kie.api.builder.*;import org.kie.api.runtime.KieContainer;import org.kie.api.runtime.KieSession;import org.kie.internal.io.ResourceFactory;import org.kie.spring.KModuleBeanFactoryPostProcessor;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.Resource;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.core.io.support.ResourcePatternResolver;import java.io.IOException;@Configurationpublic class DroolsAutoConfiguration { private static final String RULES_PATH = "rules/"; @Bean @ConditionalOnMissingBean(KieFileSystem.class) public KieFileSystem kieFileSystem() throws IOException { KieFileSystem kieFileSystem = getKieServices().newKieFileSystem(); for (Resource file : getRuleFiles()) { kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); } return kieFileSystem; } private Resource[] getRuleFiles() throws IOException { ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*"); } @Bean @ConditionalOnMissingBean(KieContainer.class) public KieContainer kieContainer() throws IOException { final KieRepository kieRepository = getKieServices().getRepository(); kieRepository.addKieModule(new KieModule() { public ReleaseId getReleaseId() { return kieRepository.getDefaultReleaseId(); } }); KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem()); kieBuilder.buildAll(); return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId()); } @Bean @ConditionalOnMissingBean(KieBase.class) public KieBase kieBase() throws IOException { return kieContainer().getKieBase(); } @Bean @ConditionalOnMissingBean(KieSession.class) public KieSession kieSession() throws IOException { KieSession kieSession = kieContainer().newKieSession(); return kieSession; } @Bean @ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class) public KModuleBeanFactoryPostProcessor kiePostProcessor() { return new KModuleBeanFactoryPostProcessor(); } public KieServices getKieServices() { System.setProperty("drools.dateformat","yyyy-MM-dd"); return KieServices.Factory.get(); }}
编写po测试对象
public class Users { private Integer uid; private String username; private String gender; private Integer age; public Users() { } public Users(Integer age, String username) { this.age = age; this.username = username; }//省略 get and set}
resource 目录下 新建 rules 目录,结构如下:
编写 .drl 规则文件 本例子为HelloWord.drl
package rules;import com.springboot.vue.pojo.Users;import java.lang.String;import java.util.List;rule "hello,word" when eval(true) then System.err.println("hello,word!");endrule "user" when $u:Users(username=="张三",age==18) then $u.setUsername("李四"); System.err.println("hello,word:"+$u.getUsername());end
drools 完美支持java api
import:导入对象
rule:规则名称
when:条件
$:定义变量
then:满足条件则执行的逻辑
end:规则结束
上面我定义了两个规则
"hello,word"
"user"
下面进行测试
@RunWith(SpringRunner.class)@SpringBootTest()public class TestApplication { @Autowired private KieSession kieSession; @Test public void testHelloWord() { System.out.println("测试。。。。。"); Users user=new Users(18,"张三"); kieSession.insert(user); kieSession.fireAllRules(); System.err.println("规则执行完毕后张三变为了:"+user.getUsername()); kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("user")); }}
测试结果:
总结:
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。