DROOL确实是相当庞大的一个项目,对于初学者来说如何快速上手使用,着实还是一个比较困难的事情。这里提供了源码中的例子,使得你可以快速地在五分钟内上手实战。
String drl1 = "global java.util.List list\n" +
"rule R1 when\n" +
" $s : String()\n" +
" $i : Integer( this == $s.length() )\n" +
" $j : Integer( this == $i * 2 )\n" +
"then\n" +
" list.add( $j );\n" +
"end\n";
String drl2 = "global java.util.List list\n" +
"rule R2 when\n" +
" $s : String()\n" +
" $i : Integer( this == $s.length() )\n" +
" $j : Integer( this == $i * 3 )\n" +
"then\n" +
" list.add( $j );\n" +
"end\n";
//创建内部规则库(很有意思:这明明就是知识库)
InternalKnowledgeBase kbase = (InternalKnowledgeBase)getKnowledgeBase( );
//添加文本串的规则 R1
kbase.addPackages(loadKnowledgePackagesFromString( drl1 ));
//创建会话
KieSession ksession = createKnowledgeSession(kbase);
//向引擎添加一个全局的list,注意看规则中的第一行描述-global java.util.List list
List<Integer> list = new ArrayList<Integer>();
ksession.setGlobal("list", list);
//添加四条事实数据
ksession.insert("test");
ksession.insert(4);
ksession.insert(8);
ksession.insert(12);
//好了,可以点火了——出发规则引擎
ksession.fireAllRules();
//于是我们便得到了保存在list中的结果
assertEquals(8, (int)list.get(0));
list.clear();
//添加一条新规则
kbase.addPackages(loadKnowledgePackagesFromString(drl2));
//删除原有的老规则
kbase.removeRule("defaultpkg", "R1");
//再次点火
ksession.fireAllRules();
//结果便来了
assertEquals(12, (int)list.get(0));
快速解读:上边演示了如何添加、删除字符串规则和基本的过程。有人不禁要问事实数据可以动态删除或修改么?没有问题的,看这个例子:
//添加事实数据
FactHandle handler = ksession.insert(12);
//变更事实数据
ksession.update(handler, 13);
//删除事实数据
ksession.delete(handler);
嗯,似乎差不多了。还差点什么,下边这三个关键的函数。
KieBase getKnowledgeBase() {
KieBaseConfiguration kBaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
return getKnowledgeBase(kBaseConfig);
}
KieBase getKnowledgeBase(KieBaseConfiguration kBaseConfig) {
KieBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kBaseConfig);
try {
kbase = SerializationHelper.serializeObject(kbase, ((InternalKnowledgeBase) kbase).getRootClassLoader());
} catch (Exception e) {
throw new RuntimeException(e);
}
return kbase;
}
public Collection<KiePackage> loadKnowledgePackagesFromString(String... content) {
return loadKnowledgePackagesFromString(null, content);
}
public Collection<KiePackage> loadKnowledgePackagesFromString(KnowledgeBuilderConfiguration kbuilderConf, String... content) {
if (kbuilderConf == null) {
kbuilderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
}
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConf);
for (String r : content) {
kbuilder.add(ResourceFactory.newByteArrayResource(r.getBytes()),ResourceType.DRL);
}
if (kbuilder.hasErrors()) {
fail(kbuilder.getErrors().toString());
}
Collection<KiePackage> knowledgePackages = kbuilder.getKnowledgePackages();
return knowledgePackages;
}
KieSession createKnowledgeSession(KieBase kbase) {
return kbase.newKieSession();
}
嗯,这次差不多了,可以移植去使用了。(完)