版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 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();
}
}
}
不会说话,抄个图