MyDroolsConfiguration.java 3.78 KB
package com.bsth.service.schedule.rules;

import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.builder.Message;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.conf.EqualityBehaviorOption;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Drools 6配置类。
 */
@Configuration
public class MyDroolsConfiguration {
    /**
     * 返回一个kiebase知识库,直接冲文件系统读入drl规则文件,
     * TODO:以后需要从数据库读入规则文件,并重新创建kbase知识库。
     */
    @Bean
    public KieBase myKieBase() {
        // Drools 6开始引入kie统一接口(jboss的jbpm工作流也使用kie接口了),整个定义方式和5差别很大
        // 这里使用全api方式创建知识库对象,不使用xml的方式,提供最大的灵活性

        // 1、创建kieservices
        KieServices kieServices = KieServices.Factory.get();
        // 2、创建KieModuleModel,默认是由kmodule.xml的方式创建,这里使用api方式闯将
        KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
        // 2.1、创建KieBaseModel,类似kmodule.xml中的kbase标签
        KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("KBase1")
                .setDefault(true)
                .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
                .setEventProcessingMode(EventProcessingOption.STREAM);
        // 2.2、创建与kbase关联的KieSessionModel,类似kmodule.xml中的kbase内的ksession标签
        kieBaseModel1.newKieSessionModel("KSession1")
                .setDefault(true)
                .setType(KieSessionModel.KieSessionType.STATEFUL)
                .setClockType(ClockTypeOption.get("realtime"));

        // 3、创建KieFileSystem,将模型xml,drl等写入,TODO:以后考虑从数据库中获取
        KieFileSystem kfs = kieServices.newKieFileSystem();
        // 3.1、写入KieBaseModel(内部包含了KieSessionModel的内容了,注意之前的KieSessionModel的创建方式)
        kfs.writeKModuleXML(kieModuleModel.toXML());

        // 3.2、写入drl(写法超多,有点混乱)
        // 这里使用文件的形式写入,TODO:以后考虑从数据库中读drl写入
        // 注意kfs写的时候如果指定path,强制为src/main/resources/加上文件名,还有就是文件名不要重复否则会覆盖的
        kfs.write("src/main/resources/HelloWorld.drl", kieServices.getResources()
                .newInputStreamResource(this.getClass().getResourceAsStream(
                        "/rules/HelloWorld.drl"), "UTF-8"));
        // TODO:还有其他drl....

        // 4、创建KieBuilder,使用KieFileSystem构建
        KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
        Results results = kieBuilder.getResults();
        if (results.hasMessages(Message.Level.ERROR))
            throw new IllegalStateException("构建drools6错误:" + results.getMessages());

        // 5、获取KieContainer
        // TODO:ReleaseId用处很大,以后再议
        ReleaseId releaseId = kieServices.getRepository().getDefaultReleaseId();
        KieContainer kieContainer = kieServices.newKieContainer(releaseId);

        // 6、创建kbase
        KieBaseConfiguration kieBaseConfiguration = kieServices.newKieBaseConfiguration();
        KieBase kieBase = kieContainer.newKieBase("KBase1", kieBaseConfiguration);

        return kieBase;
    }
}