drools动态加载规则

前言

前两篇博客:

  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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章