欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Drools学习专栏三

程序员文章站 2022-05-28 11:54:59
...

前言

前两篇博客:

  1. 规则引擎及drools的引入
  2. drools集成springboot

第一篇博客介绍了规则引擎的相关概念,以及drools的引入。
第二篇博客中,集成springboot给出了第一个demo,在第二篇博客中,通过配置kmodule.xml文件,编写drl文件,完成了第一个规则。
针对某些场景,比如规则语言动态存储在数据库里面的情形,就需要动态加载规则了。
drools版本:7.19.0.Final。

方式一:使用KieHelper封装类

drools提供了封装好的KieHelper类,通过以下几行代码实现了KieSession的构建:

		String rule = "package com.example;\r\n";
	    rule+="import com.example.service.*;\r\n";
		rule+="rule \"rule1\"\r\n";
		rule += "when\r\n";  
        rule += "\t Message(status == \"1\")";  
        rule += "\r\nthen\r\n";  
        rule +="\tSystem.out.println(\"hello\");";
        rule += "end\r\n"; 
	   
		KieHelper helper = new KieHelper();
		helper.addContent(rule, ResourceType.DRL);
		KieSession kSession = helper.build().newKieSession();

其中rule为字符串,可以从数据库读取。
使用这种方式的优点在于代码简单,重要的代码只有三行,缺点是无法对编译规则错误时的提示进行个性化的处理。推荐使用以下不借助封装类的实现方式。

方式二:不使用KieHelper封装类

	/**
	 * 由从数据库里面读出的drl构建KieSession
	 * @param drl
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static KieSession getKieSessionFromDrl(String drl) throws UnsupportedEncodingException {
		KieSession tempKieSession = null;
		KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
	    kb.add(ResourceFactory.newByteArrayResource(drl.getBytes("utf-8")), ResourceType.DRL);
		if (kb.hasErrors()) {
			String errorMessage = kb.getErrors().toString();
			System.out.println("规则语法异常---\n"+errorMessage);
			return;
		} 
		InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
		kBase.addPackages(kb.getKnowledgePackages());
		tempKieSession = kBase.newKieSession();
		return tempKieSession;
	}

可以抽象异常,将错误信息抛到上层,最终通过接口返回给前端。

结语

在下一篇博客中,将介绍一些drools的demo。