Drools 规则入库的使用

512 views
Skip to first unread message

xiyuan76

unread,
Nov 25, 2009, 12:17:13 AM11/25/09
to Groovy用户组
闭关了3天终于把Drools 规则入库整明白了。
Drools 的规则可以存放在一个规则文件中,但是如果规则文件改变了,就需要重新装入,做不到自动化。
如果把规则存入数据库,就能做到自动的更新。对于规则入库的表格的设计可以根据自己的实际情况进行设计。
最简单的设计就将规则文件的内容存入数据库。调用规则的时候,可以将规则文件的内容用另外一种方式装入。
如下是装入方式:
StringBuffer sb=new StringBuffer();
sb.append("package org.dishweb.drools \n");
sb.append("import org.dishweb.drools.test.Order;\n");
sb.append("rule \"First Rule\"\n");
sb.append("when\n");
sb.append("order:Order(sumprice>30,sumprice<=50);\n");
sb.append("then \n");
sb.append("order.setDiscounts(98);\n");
sb.append("end\n");

System.out.println(sb.toString());
PackageBuilderConfiguration config = new PackageBuilderConfiguration
();
config.setClassLoader(this.getClass().getClassLoader());
// enable the Janino compiler instead of JDT for Java semantics
JavaDialectConfiguration javaConf = (JavaDialectConfiguration)
config
.getDialectConfiguration("java");
javaConf.setCompiler(JavaDialectConfiguration.JANINO);

PackageBuilder builder = new PackageBuilder(config);

builder.addPackageFromDrl(
new StringReader(sb.toString()));
if (builder.hasErrors()) {
System.err.print(builder.getErrors());
return -1;
}
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage(builder.getPackage());
StatelessSession session = ruleBase.newStatelessSession();

Order order = new Order();
order.setSumprice(33);
session.execute(Arrays.asList(new Object[] { order }));

System.out.println("DISCOUNT IS: " + order.getDiscounts());

供大家参考。

foxgem

unread,
Nov 25, 2009, 12:33:27 AM11/25/09
to groo...@googlegroups.com
说白了跟让用户可以自己输出Groovy脚本一样,把脚本当作数据,然后用类似GroovyShell这样的解析工具加载,计算,执行。


当然前提是这些groovy所需的类在classpath中,如果要大规模用的话,让用户可以上传jar或class,然后整一个基于db或其他机制的classloader也是必不可少的。

--------------------------------------------------
From: "xiyuan76" <weiho...@163.com>
Sent: Wednesday, November 25, 2009 1:17 PM
To: "Groovy用户组" <groo...@googlegroups.com>
Subject: [Groovy用户组] Drools 规则入库的使用

songwei

unread,
Nov 25, 2009, 12:48:38 AM11/25/09
to groo...@googlegroups.com
其实我觉得创建一种更适合用户口味的DSL,开放给用户自己去写些简单逻辑,应该也
能达到比较好的效果。至少我觉得比peopleSoft算薪哪一块重新定义一套概念(元素、
累加器等等)要更加直观易懂。如foxgem所说,现在groovy脚本就可以作为规则载体,
存放在文件或数据库中都可以。当然,在用户自己提交业务规则之前,得有办法校验其
合法性。

-----邮件原件-----
发件人: groo...@googlegroups.com [mailto:groo...@googlegroups.com] 代表
foxgem
发送时间: 2009年11月25日 13:33
收件人: groo...@googlegroups.com
主题: [Groovy用户组] Re: Drools 规则入库的使用

说白了跟让用户可以自己输出Groovy脚本一样,把脚本当作数据,然后用类似
GroovyShell这样的解析工具加载,计算,执行。


当然前提是这些groovy所需的类在classpath中,如果要大规模用的话,让用户可以上

foxgem

unread,
Nov 25, 2009, 1:00:54 AM11/25/09
to groo...@googlegroups.com
这个也好搞,整一个开发规则的图形界面基本上就可以搞定了。

另外,再提供一个测试环境,可以象某些测试存储过程的IDE一样,根据存储过程的输入自动产生输入框,这样用户可以提供输入。

然后比较输出是否正确就可以了。

对于测试,我认为隔离性是最重要的。所有东西如果都染到一起,反而适得其反。

Drools强大的一点在于,对于单个规则的重用,同时还提供了规则流的概念,很好,很好哪。

对于那种特别强调策略的场合,如移动的各种套餐,打折等等,把这些策略单独剥离出来,应用规则引擎是非常好的……

--------------------------------------------------
From: "songwei" <song...@gmail.com>
Sent: Wednesday, November 25, 2009 1:48 PM
To: <groo...@googlegroups.com>
Subject: 答复: [Groovy用户组] Re: Drools 规则入库的使用

weihong

unread,
Nov 25, 2009, 2:54:55 AM11/25/09
to groo...@googlegroups.com
:)都是很好的建议,drools如果深挖掘,会有很多的内容!

--------------------------------------------------
From: "foxgem" <jianh...@hotmail.com>
Sent: Wednesday, November 25, 2009 2:00 PM
To: <groo...@googlegroups.com>
Subject: [Groovy用户组] Re: Drools 规则入库的使用

仵建锋

unread,
Nov 25, 2009, 8:14:10 PM11/25/09
to groo...@googlegroups.com
呵呵,我最近刚开始看drools,有问题就找你了

--------------------------------------------------
From: "weihong" <weiho...@163.com>
Sent: Wednesday, November 25, 2009 3:54 PM

Reply all
Reply to author
Forward
0 new messages