1.maven依賴
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
</dependency>
<!-- 決策表 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
</dependency>
<!-- 模板 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
</dependency>
2.配置
方式一:
資源目錄下配置META-INF/kmodule.xml
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
方式二:
@Configuration
public class DroolsAutoConfiguration {
private static final String RULES_PATH = "rules/";
@Bean
@ConditionalOnMissingBean(KieFileSystem.class)
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
final Resource[] resources = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
return resources;
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
}
3.使用
方式一:
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession kieSession = kc.newKieSession("HelloWorldKS");// kmodule.xml配置中ksession元素的name屬性
Address address = new Address();
address.setPostcode("99425");
RuleResult ruleResult = new RuleResult();
kieSession.insert(address);
kieSession.insert(ruleResult);
int ruleFiredCount = kieSession.fireAllRules();
logger.info(" " + ruleFiredCount + "條規(guī)則");
for (HitRule hitRule : ruleResult.getHitRules()) {
System.out.println(hitRule.getRuleName());
}
方式二:引入配置中的kieSession壹粟,其他代碼同上
@Resource
private KieSession kieSession;
4.關(guān)鍵詞解釋
https://blog.csdn.net/u012373815/article/details/53907340
KieServices:
該接口提供了很多方法贴铜,可以通過這些方法訪問KIE關(guān)于構(gòu)建和運(yùn)行的相關(guān)對(duì)象着逐,比如說可以獲取KieContainer,利用KieContainer來訪問KBase和KSession等信息潮模;可以獲取KieRepository對(duì)象赤屋,利用KieRepository來管理KieModule等.
KieServices就是一個(gè)中心,通過它來獲取的各種對(duì)象來完成規(guī)則構(gòu)建舔痪、管理和執(zhí)行等操作。
KieContainer:
可以理解KieContainer就是一個(gè)KieBase的容器锌唾,KieBase是什么呢锄码?KieBase:
KieBase就是一個(gè)知識(shí)倉庫,包含了若干的規(guī)則晌涕、流程滋捶、方法等,在Drools中主要就是規(guī)則和方法余黎,KieBase本身并不包含運(yùn)行時(shí)的數(shù)據(jù)之類的重窟,如果需要執(zhí)行規(guī)則KieBase中的規(guī)則的話,就需要根據(jù)KieBase創(chuàng)建KieSession驯耻。
KieSession:
KieSession就是一個(gè)跟Drools引擎打交道的會(huì)話亲族,其基于KieBase創(chuàng)建,它會(huì)包含運(yùn)行時(shí)數(shù)據(jù)可缚,包含“事實(shí) Fact”,并對(duì)運(yùn)行時(shí)數(shù)據(jù)事實(shí)進(jìn)行規(guī)則運(yùn)算斋枢。我們通過KieContainer創(chuàng)建KieSession是一種較為方便的做法帘靡,其實(shí)他本質(zhì)上是從KieBase中創(chuàng)建出來。的瓤帚。
KieSession就是應(yīng)用程序跟規(guī)則引擎進(jìn)行交互的會(huì)話通道描姚。
創(chuàng)建KieBase是一個(gè)成本非常高的事情涩赢,KieBase會(huì)建立知識(shí)(規(guī)則、流程)倉庫轩勘,而創(chuàng)建KieSession則是一個(gè)成本非常低的事情筒扒,所以KieBase會(huì)建立緩存,而KieSession則不必绊寻。
KieRepository:
KieRepository是一個(gè)單例對(duì)象花墩,它是一個(gè)存放KieModule的倉庫,KieModule由kmodule.xml文件定義(當(dāng)然不僅僅只是用它來定義)澄步。
KieProject:
KieContainer通過KieProject來初始化冰蘑、構(gòu)造KieModule,并將KieModule存放到KieRepository中村缸,然后KieContainer可以通過KieProject來查找KieModule定義的信息祠肥,并根據(jù)這些信息構(gòu)造KieBase和KieSession。
ClasspathKieProject:
ClasspathKieProject實(shí)現(xiàn)了KieProject接口梯皿,它提供了根據(jù)類路徑中的META-INF/kmodule.xml文件構(gòu)造KieModule的能力仇箱,也就是我們能夠基于Maven構(gòu)造Drools組件的基本保障之一。
意味著只要我們按照前面提到過的Maven工程結(jié)構(gòu)組織我們的規(guī)則文件或流程文件东羹,我們就能夠只用很少的代碼完成模型的加載和構(gòu)建工碾。
現(xiàn)在我們知道了可以通過ClasspathKieProject來解析kmodule.xml文件來構(gòu)建KieModule。
在ClasspathKieProject類中百姓,會(huì)根據(jù)kmodule.xml文件的定義渊额,將其解析并生成成KieModuleModel、KieBaseModel垒拢、KieSessionModel對(duì)象旬迹,基于這個(gè)原理,那么我們也可以拋開kmodule.xml文件求类,通過編程的方式創(chuàng)建這些Model對(duì)象奔垦。
在運(yùn)行時(shí),KieContainer會(huì)根據(jù)Model對(duì)象來創(chuàng)建KieModule尸疆、KieBase椿猎、KieSession對(duì)象。其中KieModule和KieBase只會(huì)創(chuàng)建一次寿弱,而KieSession則有可能創(chuàng)建多次犯眠,因?yàn)镵ieSession的創(chuàng)建成本很低,同時(shí)KieSession包含了運(yùn)行時(shí)的數(shù)據(jù)症革,所以可以銷毀筐咧、創(chuàng)建若干次。