??xml version="1.0" encoding="utf-8" standalone="yes"?>
at jxl.read.biff.File.<init>(File.java:77)
at jxl.Workbook.getWorkbook(Workbook.java:250)
at jxl.Workbook.getWorkbook(Workbook.java:235)
at org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:76)
at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:89)
at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:68)
at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:59)
at com.sample.DecisionTableTest.main(DecisionTableTest.java:36)
Drools调用readDecisionTable()Ҏ里面一处ؓQ?br />
InputStream is = DecisionTableTest.class.getResourceAsStream("rules\\Sample.xls");
final String drl = converter.compile( is, InputType.XLS );
需改ؓ如下Q取的class即错误解冟?br />
InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");
final String drl = converter.compile( is, InputType.XLS );
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.PackageBuilder;
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;
import org.drools.rule.Package;
public class TestPremium {
public static final String path = "rules\\premium\\0326\\02\\030006\\rate.xls";
public static void main(String[] args) throws Exception {
try {
RuleBase ruleBase = readDecisionTable();
WorkingMemory workingMemory = ruleBase.newStatefulSession();
int flag = path.indexOf("FormulaOrder");
ElementResultVO r = new ElementResultVO();
PremiumHelper helper = new PremiumHelper();
workingMemory.setGlobal("r", r);
workingMemory.setGlobal("helper", helper);
AppBaseVO base = new AppBaseVO();
AppVhlVO vhl = new AppVhlVO();
AppPrmCoefVO prmCoef = new AppPrmCoefVO();
base.setCAmtCur("01");
base.setNAmt(4000000d);
workingMemory.insert(base);
workingMemory.insert(vhl);
workingMemory.insert(prmCoef);
workingMemory.fireAllRules();
System.out.println("==========compile success!===========");
} catch (Exception e) {
System.out.println("==========compile failure!===========");
e.printStackTrace();
}
}
private static RuleBase readDecisionTable() throws Exception {
final SpreadsheetCompiler converter = new SpreadsheetCompiler();
InputStream is = TestPremium.class.getClassLoader().getResourceAsStream(path);
final String drl = converter.compile( is, InputType.XLS );
PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new StringReader( drl ) );
Package pkg = builder.getPackage();
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
return ruleBase;
}
}
++++++++++++++++++++++++++++++++++++++
执行后的一部分Q?br />
#From row number: 369
rule "_369"
salience 65167
activation-group "x"
when
vhl:AppVhlVO(CUsageCde == "374015", CVhlTyp == "365012",
eval(helper.getVhlYear(vhl.getCFstRegYm())>=4 && helper.getVhlYear(vhl.getCFstRegYm())<1000))
then
r.putCoef("rate",0.67);
r.putField("Table.col","Cvrg.NRate");
end
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;
import org.drools.rule.Package;
public class DrlPackageManager {
// 用于~存Drools的PackageQkey为Excel的完整\径,value为此文g~译q后的Package
static Map<String, Package> pkgMap = new HashMap<String, Package>();
private static Logger logger = Logger.getLogger(DrlPackageManager.class);
/**
* 通过Excel的文件名~存Drools的Package
*
* @param fileName
* @return
* @throws Exception
*/
public static Package getPackageByXsl(String fileName) throws Exception {
Package pkg = (Package) pkgMap.get(fileName);
if (pkg != null)
return pkg;
final SpreadsheetCompiler converter = new SpreadsheetCompiler();
InputStream is = null;
try {
is = DrlPackageManager.class.getResourceAsStream(fileName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
is.close();
throw new Exception("====d规则的资源文? + fileName + "出错Q请查文?+ fileName + "=====", e);
}
String drl = null;
try {
drl = converter.compile(is, InputType.XLS);
logger.debug("Drools Excel规则文gQ? + fileName + "~译?drl文g的结果:"+ drl);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
is.close();
throw new Exception("xls文g~译成drl文g出错", e);
}
PackageBuilder builder = new PackageBuilder();
StringReader srd = new StringReader(drl);
builder.addPackageFromDrl(srd);
pkg = builder.getPackage();
pkgMap.put(fileName, pkg);
is.close();
return pkg;
}
一路到底的框架Q?br /> 大多数开发者都有自己喜q框架。无特定序Q它们包括表现层框架QStruts, JSF, Cocoon和SpringQ?持久化框ӞJDO, Hibernate, Cayenne and Entity BeansQ以及结构框?EJB, 又是Spring, Pico和Excalibur), q有其它很多。每U框枉各有所长,l开发者提供子许多“卛_即用”的功能。用框架来部v应用意味着你避免了许多让h厌烦的细节,让你集中注意力到关键之处?br /> 到目前ؓ_在框架所能做的事中仍然有一个缺口,那就是商业逻辑没有框架。像EJB和Springq样的工兯好,但它们却几乎没有提及怎么l织你的那些if …then语句。把Drools加到你的开发工L中意味着现在你可?#8220;一路到?#8221;的用框架来构徏你的应用E序?/p>
2.Drools4.0版本Q?/span>
JBoss Drools是一Ƒּ源的业务规则引擎Q目前已l发布了4.0版本。在4.0版本中主要的特色和改q如下:
1.更高的性能Q较之于之前的版本,Drools 4.0更ؓ高效q且占用更少的内存空间。内部的性能试表明Q性能的提升已l从几分钟羃减ؓ若干U钟?
2.提升的表达能力:当前的发布版引入了更为强大且的业务行本语aQMVFlex表达式语aQ?br />
3.友好的业务分析工P一个具备向导功能的规则~辑器的增加Q得非E序员用户可以设计复杂的业务规则Qƈ在没有编写Q何代码的情况下自动绑定企业数据。提供带有菜单提C和下拉列表的向导来帮助用户完成设计q程?
4.规则的能力Q可视化的徏模技术可以用户声明式地为相应规则的执行路径建立讉K模型。它同样q允许在单个工作内存中存在多个ƈ发工作流QƈҎ控制典型的业务处理过E的需求,从根本上l织规则的执行?5.多应用支撑:对于有状态和无状态处理过E增强的支持以及全面的线E安全性,辅助Drools更轻易的嵌入在Javaq_QJavaEE以及面向服务的商业应用之中?
6.直接可和Hibernate集成Q用户可以直接在Hibernate驱动的RDBMS查询中对数据QfactsQ进行判断。现有的Hibernatelg可以直接用在规则引擎里,减少~码的工作量?
7.为非E序员设计的BRMSQ从技术角度来看,新的BRMSZWeb开发,使用AJAX呈现Q便于协作,是一个编写、版本化控制和管理规则的pȝ。业务分析师目前可以交互式的授权或修改自动{换的规则。管理员目前具备完全的生命周期控制能力,包含何种规则在QA阶段Q分D(stagingQ,以及实施QproductionQ阶D늭{?
3.Drools的M架构Q?/span>
我们使用Drools是Z让它处理数据与规则的关系Q因此Drools要获得数据和获得规则Q然后进行执行。因此Drools分ؓ~制和运行时两个部分?
~制是指产生rule的过E,Drools用DRLQ或者XML来描q规则。编制的q程包括则徏立DRL 或XML 文gQ传入一个由Antlr 3 文法器定义的解析器中。解析器Ҏ件中规则文法的正性进行检查ƈ为descr 建立一个中间结构,在AST 中的descr 代表规则的描q。AST 然后descr 传入Package Builder中,由其q行打包。Package Builder 同时负责包括打包中用到的所有代码生器和编译器。Package 对象是自包含q可配置的,它是一个包含规则的序列化的对象?
RuleBase 是运行时lgQ包含一个或多个Package。Package 在Q何时候都可以向RuleBase中添加或删除。一个RuleBase 可以同时初始化多个Working MemoryQ在光l护着一个弱引用Q除非重新进行配|。Working Memory 包含许多子组Ӟ如Working Memory Event Support(事g支持),Truth Maintenance System(真值维护系l?, Agenda ?Agenda Event Support(事g支持)。向Working Memory 中设|对象的工作可能要在建立了一个或多个Ȁzȝ规则后才l束。Agenda 负有规划Ȁz规则运行的责Q?
4.Drools主要有以下类实现Q?/span>
~制Q?
XmlParser,DrlParser 分别用来解析XML描述的规则文件和DRL描述的规则文件?
PackageBuilder 创徏package实例?
例如Q?
PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "package1.drl" ) ) );
builder.addPackageFromXml( new
InputStreamReader( getClass().getResourceAsStream( "package2.xml" ) ) );
Package pkg = builder.getPackage();
q行时的c:
RuleBase 使用RuleBaseFactory 实例化,默认情况下返回一个ReteOO 的RuleBase。Package通过使用addPackage Ҏ按顺序加入。你可以指定M名称I间的Packages 或者同一名称的多个包加入RuleBase?
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
事实数据相关c:
WorkingMemory 保存q行时事实数据的地方?
由ruleBase产生QWorkingMemory wm= ruleBase.newStatefulSession();
加蝲事实数据Q?
wm.insert(object );
insertҎq回一个FactHandle对象指向workingMemory中对象的引用。如果要对Objectq行修改删除{操作都要通过FactHander对象来完成?
在准备好RuleQ和Fact?可以调?WorkingMemory对象?fireAllRulesQ)Ҏ执行规则引擎?
Agenda上面提到q它负有规划Ȁz规则运行的责Q?
它运行过E分两个阶段Q?
1Q?WorkingMemory Actions Q?assert 新的 facts Q修改存在的 facts ?retract facts 都是 WorkingMemory Actions 。通过在应用程序中调用 fireAllRules() ҎQ会使引?转换?Agenda Evaluatioin 阶段?
2Q?Agenda Evaluation Q尝试选择一条规则进行激发( fire Q。如果规则没有找到就 退出,否则它就试Ȁ发这条规则,然后转换?WorkingMemory Actions 阶段Q直?Agenda中ؓI?nbsp;