美文网首页
4.SpringBoot引入drools

4.SpringBoot引入drools

作者: 元代码 | 来源:发表于2018-06-20 12:14 被阅读0次

    1.maven依赖

    <dependency>
    
    <groupId>org.kie</groupId>
    
    <artifactId>kie-api</artifactId>
    
    </dependency>
    
    <!-- 决策表 -->
    
    <dependency>
    
    <groupId>org.drools</groupId>
    
    <artifactId>drools-decisiontables</artifactId>
    
    </dependency>
    
    <!-- 模板 -->
    
    <dependency>
    
    <groupId>org.drools</groupId>
    
    <artifactId>drools-templates</artifactId>
    
    </dependency>
    

    2.配置

    方式一:

    资源目录下配置META-INF/kmodule.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    
    <kbase name="rules" packages="rules">
    
    <ksession name="ksession-rules"/>
    
    </kbase>
    
    </kmodule>
    

    方式二:

    @Configuration
    
    public 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();
    
    final Resource[] resources = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
    
    return resources;
    
    }
    
    @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());
    
    }
    
    private KieServices getKieServices() {
    
    return KieServices.Factory.get();
    
    }
    
    @Bean
    
    @ConditionalOnMissingBean(KieBase.class)
    
    public KieBase kieBase() throws IOException {
    
    return kieContainer().getKieBase();
    
    }
    
    @Bean
    
    @ConditionalOnMissingBean(KieSession.class)
    
    public KieSession kieSession() throws IOException {
    
    return kieContainer().newKieSession();
    
    }
    
    }
    

    3.使用

    方式一:

    KieServices ks = KieServices.Factory.get();
    
    KieContainer kc = ks.getKieClasspathContainer();
    
    KieSession kieSession = kc.newKieSession("HelloWorldKS");// kmodule.xml配置中ksession元素的name属性
    
    Address address = new Address();
    
    address.setPostcode("99425");
    
    RuleResult ruleResult = new RuleResult();
    
    kieSession.insert(address);
    
    kieSession.insert(ruleResult);
    
    int ruleFiredCount = kieSession.fireAllRules();
    
    logger.info(" " + ruleFiredCount + "条规则");
    
    for (HitRule hitRule : ruleResult.getHitRules()) {
    
    System.out.println(hitRule.getRuleName());
    
    }
    

    方式二:引入配置中的kieSession,其他代码同上

    @Resource
    
    private KieSession kieSession;
    

    4.关键词解释

    https://blog.csdn.net/u012373815/article/details/53907340

    KieServices:

    该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;可以获取KieRepository对象,利用KieRepository来管理KieModule等.

    KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。

    KieContainer:

    可以理解KieContainer就是一个KieBase的容器,KieBase是什么呢?KieBase:

    KieBase就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。

    KieSession:

    KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来。的。

    KieSession就是应用程序跟规则引擎进行交互的会话通道。

    创建KieBase是一个成本非常高的事情,KieBase会建立知识(规则、流程)仓库,而创建KieSession则是一个成本非常低的事情,所以KieBase会建立缓存,而KieSession则不必。

    KieRepository:

    KieRepository是一个单例对象,它是一个存放KieModule的仓库,KieModule由kmodule.xml文件定义(当然不仅仅只是用它来定义)。

    KieProject:

    KieContainer通过KieProject来初始化、构造KieModule,并将KieModule存放到KieRepository中,然后KieContainer可以通过KieProject来查找KieModule定义的信息,并根据这些信息构造KieBase和KieSession。

    ClasspathKieProject:

    ClasspathKieProject实现了KieProject接口,它提供了根据类路径中的META-INF/kmodule.xml文件构造KieModule的能力,也就是我们能够基于Maven构造Drools组件的基本保障之一。

    意味着只要我们按照前面提到过的Maven工程结构组织我们的规则文件或流程文件,我们就能够只用很少的代码完成模型的加载和构建。

    现在我们知道了可以通过ClasspathKieProject来解析kmodule.xml文件来构建KieModule。

    在ClasspathKieProject类中,会根据kmodule.xml文件的定义,将其解析并生成成KieModuleModel、KieBaseModel、KieSessionModel对象,基于这个原理,那么我们也可以抛开kmodule.xml文件,通过编程的方式创建这些Model对象。

    在运行时,KieContainer会根据Model对象来创建KieModule、KieBase、KieSession对象。其中KieModule和KieBase只会创建一次,而KieSession则有可能创建多次,因为KieSession的创建成本很低,同时KieSession包含了运行时的数据,所以可以销毁、创建若干次。

    相关文章

      网友评论

          本文标题:4.SpringBoot引入drools

          本文链接:https://www.haomeiwen.com/subject/grotyftx.html