DROOL 5分钟上手Case

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();
}

嗯,这次差不多了,可以移植去使用了。(完)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值