* @throws IOException
public File ruleTableConvertDRL(String ruleTablePath) throws IOException{
SpreadsheetCompiler compiler = new SpreadsheetCompiler();
File inFile = new File(ruleTablePath);
File outFile = new File("e://outFile.txt");
InputStream xlsStream = null;
OutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter out = null;
try {
xlsStream = new FileInputStream(inFile);
String strRule = compiler.compile(xlsStream, InputType.XLS);
fos = new FileOutputStream(outFile);
osw = new OutputStreamWriter(fos);
out = new BufferedWriter(osw);
out.write(strRule);
out.flush();
System.out.println("\n" + strRule);
} catch (IOException e) {
throw new IOException("没找到文件或写入文件错误");
}finally{
xlsStream.close();
fos.close();
osw.close();
out.close();
return outFile;
} 决策表:
package com.sinosoft.common.drools;
//generated from Decision Table
import com.sinosoft.ecif.scoreforgift.schema.model.FinalScore;
import com.sinosoft.ecif.scoreforgift.schema.model.ScoreInfo;
function void test(){
System.out.println("System.out.println()");
// rule values at B11, header at B6
rule "Fc_11"
$finalScore:FinalScore(years == "0")
$finalScore.setScore($finalScore.getScore()+100);
// rule values at B12, header at B6
rule "Fc_12"
$finalScore:FinalScore(years == "1", arglossRatio>=0,arglossRatio<20)
$finalScore.setScore($finalScore.getScore()+50);
// rule values at B13, header at B6
rule "Fc_13"
$finalScore:FinalScore(years == "1", arglossRatio>=20,arglossRatio<50)
$finalScore.setScore($finalScore.getScore()+30);
// rule values at B14, header at B6
rule "Fc_14"
$finalScore:FinalScore(years == "1", arglossRatio>=50,arglossRatio<101)
$finalScore.setScore($finalScore.getScore()+0);
// rule values at B15, header at B6
rule "Fc_15"
$finalScore:FinalScore(years == "2", arglossRatio>=0,arglossRatio<20)
$finalScore.setScore($finalScore.getScore()+100);
// rule values at B16, header at B6
rule "Fc_16"
$finalScore:FinalScore(years == "2", arglossRatio>=20,arglossRatio<50)
$finalScore.setScore($finalScore.getScore()+60);
// rule values at B17, header at B6
rule "Fc_17"
$finalScore:FinalScore(years == "2", arglossRatio>=50,arglossRatio<101)
$finalScore.setScore($finalScore.getScore()+0);
// rule values at B18, header at B6
rule "Fc_18"
$finalScore:FinalScore(years == "3", arglossRatio>=0,arglossRatio<20)
$finalScore.setScore($finalScore.getScore()+150);
// rule values at B19, header at B6
rule "Fc_19"
$finalScore:FinalScore(years == "3", arglossRatio>=20,arglossRatio<50)
$finalScore.setScore($finalScore.getScore()+90);
// rule values at B20, header at B6
rule "Fc_20"
$finalScore:FinalScore(years == "3", arglossRatio>=50,arglossRatio<101)
$finalScore.setScore($finalScore.getScore()+0);
说一下我在编辑决策表时遇到的问题:
1、RuleTable之前对决策表的声明中,最后一行的声明不能合并单元格,否则,此声明之前的所有声明都不会被解析。
如我的例子中,最后一个声明是第四行的functions,functions的方法体必须在一个单元格中,不能向后合并单元格。
2、ACTION列中,如果没有对象类型声明,则执行体的句末必须加上分号“;”,如果有对象类型声明,则可以不加。
如我的例子中,如果第8行的ACTION列中没有声明$finalScore,则下面的执行体必须加上分号,否则会报语法错误。
3、注意解析后的规则中的条件部分,years=="3",arglossRadio>=50,arglossRadio<101.用值替代的方法,显示的就是数字,用简单的单元值代入,显示的是字符串,但却不影响程序的正常运行。
4、RuleSet对应的就是drl文件中的package。
5、drools6需要高版本的poi依赖包,我用的是poi-3.5,一直提示没有isInRange方法,换做poi-3.9解决。
KnowledgeBuilder:作用就是用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。
KnowledgeBuilder
和规则的区别是:规则是匹配到了条件之后,执行then后面的代码,query匹配到了之后将匹配到的fact对象返回到一个结果集,通过kie可以获取。也可以在rule中使用。类似于java类中的import,可以引用java类,此时用法与java代码中的import一致,也可以引用静态方法,这点和java代码有区别。类似于java类中的package,当drl文件存放的路径与drl文件中的package定义不同时,类似于java类中的私有方法,function只能在drl当前文件内调用,算是一种“私有”方法。
决策表是Drools规则引擎的重要应用场景之一。如果你学习了基础的Drools语法知识,想进一步精通Drools规则引擎中决策的表的详细使用;如果你在实践中大量用到决策表;那么,这套课程会帮你通过实战的角度分析各种决策表的语法和使用场景,帮你节省学习成本,提升使用效率。同时,在课程中还提供了相应的一些实战小技巧,帮你更加灵活,精通的使用Drools规则引擎的决策表。
在之前的文章中,我们的业务规则都是写在了`drl`文件中,这对开发人员来说是没有什么问题,如果是业务人员则不怎么友好,这篇文章我们简单学习一下`drools`中决策表的使用,规则是写在`excel`文件中。
Drools除了支持drl形式的文件外还支持xls格式的文件(即Excel文件)。这种xls格式的文件通常称为决策表(decision table)。
决策表(decision table)是一个“精确而紧凑的”表示条件逻辑的方式,非常适合商业级别的规则。决策表与现有的drl文件可以无缝替换。Drools提供了相应的API可以将xls文件编译为drl格式的字符串
一个决策表的例子如下:
决策表的语法:
RuleSet
相当于drl文
Drools 决策表的使用决策表简介引用官方的话
决策表是一个“精确而紧凑的”表示条件逻辑的方式,非常适合商业级别的规则。
目前决策表支持xls格式和csv格式。决策表与现有的drools drl文件使用可以无缝替换。
什么时候使用决策表
规则能够被表达为模板+数据的格式,考虑使用决策表
很少量的规则不建议使用决策表
不是遵循一组规则模板的规则也不建议使用决策表
决策表格式RuleSet
一个典型的DRL文件:
[code="java"]①package com.sample //包名,不可以与关键字冲突
②import com.sample.DroolsTest.Message;//本文件需要导入的类
③global java.util.List myGlobalList;//全局变量
④//定义函数体
function String hello(String na...
关于Drools规则引擎,之前已经写了几篇相关文章,如果大家不熟悉的可以移步了解下:本篇博客主要为大家列举一些常用,简单的drl文件,帮助大家更加深入地了解其drl文件地编写格式及常用的操作符说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致,主要用于可以根据kmodule.xml中不同的package属性来指定加载哪个.drl文件,packa...
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DLL是Dynamic Link Library(即“动态链接库”)的缩写。从Microsoft公司推出首个版本的Win
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++),允许Java代码和其他语言写的代码进行交互的一种机制,JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写...
Drools 5 采用了原生的规则语言,那是一种非 XML 文本格式。在符号方面,这种格式是非常轻量的,它的应用非常简单。可以适用于比较复杂的业务逻辑,本例是用于计费系统的批价,粗略来说,有按次收费,按月收费,按照流量收费,又根据前提不同,使用不同的优惠策略,比如购买了某产品赠送800通话实践100分钟,又有可能根据当月实际使用天数赠送一定的通话时长。如此复杂场景使用规则引擎再好不过了,将动...
Drools规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。本次课程的主要内容分为以下几个方面:1.规则引擎、 Drools规则引擎简介2.Drools规则引擎各类基础知识点讲解,如kmodule、no-loop、salience等3.各类基础函数以及决策表,动态加载规则4.实战式教学以及课程总结