计算机系统应用教程网站

网站首页 > 技术文章 正文

drools动态加载规则(动态加载实例的步骤)

btikc 2024-11-16 17:20:38 技术文章 1 ℃ 0 评论

动态规则,是指在不重启服务器的前提下使业务规则发生变化,且不影响服务器的正常使用,从而实现动态业务变化的规则。

如果还不了解drools的情况下,请先查看作者其他两篇关于drools的文章。

drools动态规则的实现主要有两种方式:字符串拼接方式和构建kjar两种。

字符串拼接的方式

一个drools的规则文本如下:

```
package rules.rulesHelo
import com.pojo.Person
	rule “规则1"
		when 
			eval(true);
		then 
			System.out.println(“hello world”);
	end
	rule “规则2"
		when 
			$p:Person();
		then 
			System.out.println(“对象” + $p);
	end
```

原理:

1.可以将规则文本以字符串的形式存储在数据库中。

2.然后定时从数据库中拉取最新的规则文本的字符串。

3.将规则文本一次性加载到内存中。

4.基于业务取选择覆盖或者新增,重新build,然后进行全局缓存。

具体实现:

public KieContainer loadForRule(String drlStr) {
        KieServices ks = KieServices.Factory.get();
        KieRepository kr = ks.getRepository();
        KieFileSystem kfs = ks.newKieFileSystem();

        kfs.write("src/main/resources/rules/" + drlStr.hashCode() + ".drl", drlStr);
        
        // 将KieFileSystem加入到KieBuilder
        KieBuilder kb = ks.newKieBuilder(kfs);

        // 编译此时的builder中所有的规则
        kb.buildAll();
        if (kb.getResults().hasMessages(Message.Level.ERROR)) {
            throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
        }

        return ks.newKieContainer(kr.getDefaultReleaseId());
    }

后续从缓存中加载规则:

KieSession kieSession = kContainer.newKieSession();

构建kjar

生成kjar的动态规则与拼接字符串的方式有相似之处,核心思想与Workbench构建kjar相似,kjar的核心思想是kmodule.xml配置文件,而Kie为开发人员提供了这样的API。

原理:

规则引擎服务中并不包含规则,服务启动时,将从Maven存储库中拉取kjar包(实际上就是一个约定好的jar包),并加载其中的规则。

启动以后,规则引擎服务将不停的监视Maven存储库中的规则kjar包是否更新(轮训监控,监控时间为kScanner 中配置),如果更新则更新其中新的规则,规则引起服务本身不需重新启动。

核心实现:

private KieContainer kContainer;

    @PostConstruct
    public void setUp() {
        KieServices ks = KieServices.Factory.get();

        ReleaseId releaseId = ks.newReleaseId("com.amao.drools", "rules-kjar", "1.0-SNAPSHOT");

        kContainer = ks.newKieContainer(releaseId);
        KieScanner kScanner = ks.newKieScanner(kContainer);

        //定时轮训(单位,毫秒)仓库中对应的jar包
        kScanner.start(10000L);
    }

rules-kjar包是一个kjar项目,其中包含了kmodule.xml文件和Drools规则.drl文件。kjar项目是指引入了kie-maven-plugin插件,并指定打包为kjar,在打包的过程中,插件会校验以drl定义的规则是否可以正常编译。


drools官方文档

https://docs.jboss.org/drools/release/7.6.0.Final/drools-docs/html_single/index.html#_kiescanner

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表