drools-changeSet

本文详细介绍了如何使用Drools规则引擎的CHANGE_SET特性,通过XML配置实现规则资源的动态加载与更新,避免了代码级别的修改,特别适用于已打包程序的规则调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本形式

<change-set xmlns='http://drools.org/drools-5.0/change-set'
	xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
	xs:schemaLocation='http://drools.org/drools-5.0/change-setchange-set-5.0.xsdhttp://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd'>

	<add>
		<!-- 直接引入 -->
		<resource source='classpath:com/sample/godme.drl' type='DRL' />
		<!-- 下面两种方式没写,例子请注释 -->
		<!-- 文件夹引入,自动导入文件夹下的文件 -->
		<resource source="classPath:com/sample/drl/" type="DRL"/>
		<!-- 外部链接引入 -->
		<resource source="http://www.baidu.com" type="DRL" />
	</add>

</change-set>

加载方式

一般加载

 public static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("godme.drl", DroolsTest.class), ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

changeSet

public static KnowledgeBase getBase() throws Exception{
    	// 创建builder
    	KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    	// builder添加资源,并指定资源类型
    	builder.add(ResourceFactory.newClassPathResource("rule.xml",DroolsTest.class), ResourceType.CHANGE_SET);
    	// 解析错误
    	KnowledgeBuilderErrors errors = builder.getErrors();
    	// 如果有错误则抛出
    	if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
    	// 创建知识库
    	KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase();
    	// 知识库加载知识包
    	base.addKnowledgePackages(builder.getKnowledgePackages());
    	return base;
    }

其实和一般加载完全一样,只是在指定资源文件类型时注明的是CHANGE_SET

运行一下

drl

package com.sample;

// 声明类
declare Person
	name:String
	age:int
	male:String
end


rule "attr_filter"
	when
		$p:Person();
	then
		System.out.println($p);
end

java

 public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = getBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            FactType personClasee = kbase.getFactType("com.sample", "Person");
            Object person = personClasee.newInstance();
            HashMap<String, Object> attrs = new HashMap<>();
            attrs.put("name", "godme");
            attrs.put("age", 45);
            attrs.put("male", "male");
            personClasee.setFromMap(person, attrs);
            
            ksession.insert(person);
            ksession.fireAllRules();
            logger.close();
            
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

结果

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Person( name=godme, age=45, male=male )

可以说,通过CHANGE_SET只是把资源整合封装了一下,通过外部配置进行整合和修改,不需要直接改动代码。

如果程序已经打包,可以说,这个办法简直不要太方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值