Drools动态更新规则

Drools简介

简单说明一下规则动态插拔使用到的Drools相关类。

类名使用说明
KnowledgeBuilder在业务代码中收集已编写的规则,并对规则文件进行编译,生成编译好的KnowledgePackage 集合,提供给其他API使用。通过其提供的hasErrors()方法获得编译过程中是否有错,getErrors()方法打印错误信息。支持drl文件、dslr文件和xls文件等。
KnowledgePackage存放编译好的规则对象
KnowledgeBase收集应用当中知识(knowledge)定义的知识库对象(KnowledgePackage)在一个 KnowledgeBase当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等,并创建session对象(StatefulKnowledgeSession和StatelessKnowledgeSession)

动态加载规则

1. 项目依赖

		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-compiler</artifactId>
			<version>7.37.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-core</artifactId>
			<version>7.37.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-templates</artifactId>
			<version>7.37.0.Final</version>
		</dependency>

2. 实现

(1) 新增规则

首先,新增规则,通过KnowledgeBuilder收集规则,将规则文件进行编译;然后通过KnowledgeBuilder.getKnowledgePackages()方法获取KnowledgePackage;最后将KnowledgePackage对象存入KnowledgeBase,完成对规则库的动态插入规则。

    /**
     * @Description: 对knowledgeBase操作,规则库新增规则操作
     * @Param: InternalKnowledgeBase knowledgeBase 规则库
     * @Param: String ruleContent 规则内容
     * @return:
     */
    private void addKnowledgePackages(InternalKnowledgeBase knowledgeBase, String ruleContent) {
        try {
            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
            Resource resource = ResourceFactory.newReaderResource(new StringReader(ruleContent));
            kbuilder.add(resource, ResourceType.DRL);
            if (kbuilder.hasErrors()) {
                log.info("ADD RULE FILE ERROR: " + kbuilder.getErrors().toString());
            }
            knowledgeBase.addPackages(kbuilder.getKnowledgePackages());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

(2) 删除规则

使用getRule()、removeRule()方法实现规则删除。

    /**
     * @Description: 删除规则
     * @Param: ruleName 规则名称
     * @Param: knowledgeBase 规则库
     * @Param: packageName 包命名
     * @return: 
     */
    private void delRule(String ruleName, InternalKnowledgeBase knowledgeBase, String packageName) {
        Rule rule = knowledgeBase.getRule(packageName, ruleName);
        if (rule != null) {
            knowledgeBase.removeRule(packageName, ruleName);
            log.info("Del RuleName : {}", ruleName);
        }
    }

(3) 更新规则

更新规则过程就是重复上述删除+新增的过程,不再赘述。

最后,贴一下规则示例,仅供参考:

package rule.noticepkg
import java.util.*;
import com.indocloud.indo.oss.fm.engine.dto.AlarmDTO;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderError;
import org.kie.internal.builder.KnowledgeBuilderErrors;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceTypeImpl;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.logger.KnowledgeRuntimeLoggerFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import function com.indocloud.indo.oss.fm.engine.util.AlarmExecuteActionUtils.executeAction;

rule "c38f77a9a883424993c59c48b338dbf0"
  lock-on-active true
  salience 2
	when
		$alarm:AlarmDTO(originType == 'alarm' && originSeverity == '4')
	then
	   HashMap<String,Object> actionMap = new HashMap<String,Object>();
	   actionMap.put("frnType","2");
       executeAction(actionMap,$alarm,"7","c38f77a9a883424993c59c48b338dbf0");
end
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Drools是一个基于规则引擎的开源项目,允许用户定义和管理业务规则,并将其与应用程序集成。Drools的一个重要特性是能够动态更新规则,以便在运行时更改应用程序的行为。 使用Drools动态更新规则的过程如下: 1. 配置规则引擎:在应用程序中集成Drools,并配置规则引擎的相关参数,如规则库的位置、编译方式等。 2. 定义规则:使用Drools提供的语法,定义需要的规则规则由条件和动作组成,条件用于匹配输入数据,而动作则定义了规则执行时应该执行的操作。 3. 加载规则:将规则库加载到Drools规则引擎中。可以选择在应用程序初始化时加载规则,或者在运行时动态加载规则。 4. 动态更新规则:在运行时,通过修改规则库中的规则文件或从数据库、文件等外部来源加载新的规则,实现动态更新规则Drools提供了API接口,可以通过调用相关方法动态添加、修改或删除规则。 5. 触发规则引擎执行:一旦规则库发生变化,需要手动或自动触发规则引擎执行规则Drools提供了执行规则的方法,可以在应用程序中调用以触发规则的执行。 动态更新规则可以带来很多好处。首先,它允许业务人员在不修改应用程序代码的情况下改变业务逻辑,提高了灵活性和可维护性。其次,动态更新规则可以在不停机的情况下进行,不会影响应用程序的正常运行。最后,它还可以减少应用程序的维护成本,因为业务规则不再需要硬编码在代码中,而是可以通过规则引擎进行管理和维护。 综上所述,Drools动态更新规则功能可以帮助应用程序实现灵活的业务逻辑,并提供可维护和可扩展的规则管理机制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值