drools-加载流程

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/82226749
package com.sample;

import java.util.Arrays;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.StatelessKnowledgeSession;

public class DroolsTest {

    public static final void main(String[] args) {
        try {
        	// 1. builder  	加载
        	//		0. KnowledgeBuilderFactory获取builder
        	//		1. 加载资源(drl, dsl)	ResourceFactory资源获取
        	//		2. 解析规则
        	//		3. 异常处理
        	// 2. package	打包
        	// 3. base		知识库
        	// 4. session	会话
        	//		0. KnowledgeBaseConfiguration	配置
        	//		1. StatelessKnowledgeSession	无状态
        	//		2. StatefulKnowledgeSession		有状态
        	// 5. 日志
        	
        	// KnowledgeBuilderFactory生成builder
        	KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
            // 添加资源
        	builder.add(ResourceFactory.newClassPathResource("resource.drl"), ResourceType.DRL);
        	// 可以指定文件的类加载路径
        	//builder.add(ResourceFactory.newClassPathResource("resource.drl",DroolsTest.class), ResourceType.DRL);
            
        	// 检测解析错误
        	KnowledgeBuilderErrors errors = builder.getErrors();
        	if(errors.size() > 0){
        		// 抛出异常
        		for(KnowledgeBuilderError error:errors){
        			throw new Exception(error.getMessage());
        		}
        	}
        	
        	// 生成知识库
        	KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        	// 打包,添加包
        	kbase.addKnowledgePackages(builder.getKnowledgePackages());
            // 获取会话
        	
        	
        	// 有状态
        	StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
        	Person p1 = new Person();
        	Person p2 = new Person();
        	// 需插入
        	ksession.insert(p1);
        	ksession.insert(p2);
        	// 执行
        	ksession.fireAllRules();
        	// 关闭
        	ksession.dispose();
        	
        	
        	// 无状态
        	StatelessKnowledgeSession ksession2 = kbase.newStatelessKnowledgeSession();
        	// 直接简单传入,自动启动和关闭
        	ksession2.equals(Arrays.asList(p1, p2));
        	
        	
        	
        	
        	/**
        	 * 有状态和无状态的区别,在于活动的复用和管理
        	 * 
        	 * 1. 活动
        	 * 		有状态的会话处于激活状态,可以动态的插入数据和执行规则,中途允许额外操作
        	 * 		无状态的会话好比回光返照,只可以一次性的执行预定的任务,中途不允许插入新操作
        	 * 
        	 * 2. 管理
        	 * 		有状态的会话需要手动管理,insert,dispose等操作
        	 * 		无状态的会话不需处理,自动关闭和插入数据,execute已经包含了insert,fireAllRules,dispose等操作
        	 * 
        	 * 3. 对比
        	 * 		有状态会话用于实验,注重调整过程
        	 * 		无状态会话用于复验,注重运行结果
        	 */
            // 获取日志
        	KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            
        	
        	
        	// 业务
        	ksession.fireAllRules();
            /**
             * 业务逻辑及数据
             */
        	// 业务结束
        	ksession.dispose();
        	// 关闭日志
        	logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

不会说话,抄个图

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/82226749