尝试drools规则引擎,业务与功能分离神器(demo)

1,345 阅读2分钟
mp.weixin.qq.com/s?src=11&ti…


中文网站: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"));   }}


测试结果:



总结:

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。