基本形式
<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只是把资源整合封装了一下,通过外部配置进行整合和修改,不需要直接改动代码。
如果程序已经打包,可以说,这个办法简直不要太方便。