调研规则引擎用于八字命理中介绍了easyrules,easyrules比较轻量,但实际使用规则引擎,还是drools更能胜任复杂的业务。因为决策表可以让这个逻辑更加优雅
为什么一定要研究规则引擎,因为边缘计算中规则引擎是一个技术趋势,但是drools在边缘中运行就有些重了。当你看了很多命理书的时候,感觉还是用规则引擎来做,比使用java设计模式要强的多。
我的目的是八字命理,并不想把kie-spring再来一遍,于是就使用到fast-drools-spring-boot-starter这个插件

<properties><version.fast-drools>8.0.7</version.fast-drools><version.lombok>1.16.14</version.lombok><version.spring-cloud>2.0.1.RELEASE</version.spring-cloud></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>com.github.hongwen1993</groupId><artifactId>fast-drools-spring-boot-starter</artifactId><version>${version.fast-drools}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${version.lombok}</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId><version>${version.spring-cloud}</version></dependency></dependencies>

1 决策表

出现下面的错误是因为dto这个对象没有解析到,这里主要dto的位置要填写那个格,按照上图说明

2021-02-27 16:53:56.160 ERROR 1824 --- [pool-1-thread-1] com.drools.core.KieTemplate              : file not fount.
2021-02-27 16:53:56.478  WARN 1824 --- [           main] o.d.c.kie.builder.impl.KieBuilderImpl    : File 'file0.drl' is in folder '' but declares package 'com.dzmsoft.qingqiu'. It is advised to have a correspondance between package and folder names.
2021-02-27 16:53:57.269 ERROR 1824 --- [           main] o.d.c.kie.builder.impl.KieProject        : Unable to build KieBaseModel:defaultKieBase
Predicate 'dto.setResult("旺")' must be a Boolean expression

编译出了错误,这个时候就可以参照Drools决策表的使用将决策表转化为drl查看发生了什么

import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;@Testpublic void test02() throws FileNotFoundException {File file = new File("F:\\bazi_rules\\shy.xlsx");InputStream is = new FileInputStream(file);SpreadsheetCompiler compiler = new SpreadsheetCompiler();String drl = compiler.compile(is, InputType.XLS);System.out.println(drl);}

下面有两个地方有异常,
dto.setResult(旺)说明ACTION应该写成dto.setResult("$1");,加上引号
② when条件不正确,故提示then这个错误。第二个condition没有解析,解决方案是引用同一个对象的condition合并为一个单位格,赋值dto:ShyGenYinDto

package com.dzmsoft.qingqiu.rule;
//generated from Decision Table
import com.dzmsoft.qingqiu.rule.dto.ShyGenYinDto;
import java.lang.Integer;
import java.lang.String;
// rule values at B8, header at B3
rule "根根在年支、月支"whendto:ShyGenYinDto(yz == "助")mzthendto.setResult(旺);
end// rule values at B9, header at B3
rule "根印在年支、月支"whendto:ShyGenYinDto(yz == "助")mzthendto.setResult(旺);
2021-02-27 17:10:09.325 ERROR 8744 --- [pool-1-thread-1] com.drools.core.KieTemplate              : file not fount.
2021-02-27 17:10:09.634  WARN 8744 --- [           main] o.d.c.kie.builder.impl.KieBuilderImpl    : File 'file0.drl' is in folder '' but declares package 'com.dzmsoft.qingqiu'. It is advised to have a correspondance between package and folder names.
2021-02-27 17:10:09.729 ERROR 8744 --- [           main] o.d.c.kie.builder.impl.KieProject        : Unable to build KieBaseModel:defaultKieBase
[11,1]: [ERR 102] Line 11:1 mismatched input 'then' in rule "根根在年支、月支"

正确的决策表生成规则是这样的了

rule "根根在年支、月支"whendto:ShyGenYinDto(yz == "助", mz == "助")thendto.setResult("旺");
end

可以看到决策表中如果出现tgbqcn>=Integer.valueOf($1) and tgbqcn<=Integer.valueOf($2),生成drl的时候就出现问题了,解决方案也比较简单,采用tgbqcn>=Integer.valueOf($1) , tgbqcn<=Integer.valueOf($2),用逗号代替and就可以了

rule "月支根,年支、日支克月支,根本气透干2个以上"whendto:ShyGenYinDto(yz == "克", mz == "助", dz == "克", bqtg == "是", tgbqcn>=Integer.valueOf(2) and tgbqcn<=Integer.valueOf(3))thendto.setResult("弱");
end

这里再思考一个问题,决策表的规则那么多,它们之间怎么样保证互斥关系的呢?就好比我的实验,发现实施效果并不理想。

为防止冲突,增加了两个配置ACTIVATION-GROUP对规则进行分组和Sequential设置为顺序执行,设置好后,发现还是不行
将决策表生成的规则,写入到drl文件中,进行调试。
原则上根根在年支、时支,天干不是印比一片(包括合化)的salience要高于年支根,月支泄根一次,本气透干为什么,匹配到后者呢?
activation-group设置的一组规则,只需要一个执行,其他的就不执行了,相当于组内的规则是互斥的。那么只要年支根,月支泄根一次,本气透干activation-group为2,同一个规则,就可以匹配到正确的了。
但是不同activation-group之间的呢?并不影响。
agenda-group是同一组的规则都会执行。

package com.dzmsoft.qingqiu.rules;
//generated from Decision Table
import com.dzmsoft.qingqiu.rules.dto.ShyGenYinDto;
import java.lang.Integer;
// rules values at B90, header at B4
rule "根根在年支、时支,天干印比一片"salience 65454activation-group "2"whendto:ShyGenYinDto(yz == "助", hz == "助", tgybyp == "1")thendto.setResult("旺");dto.setDesc("根根在年支、时支,天干印比一片");
end// rules values at B91, header at B4
rule "根根在年支、时支,天干合化印比一片"salience 65453activation-group "2"whendto:ShyGenYinDto(yz == "助", hz == "助", tghhybyp == "1")thendto.setResult("旺");dto.setDesc("根根在年支、时支,天干合化印比一片");
end// rules values at B92, header at B4
rule "根根在年支、时支,天干不是印比一片(包括合化)"salience 65452activation-group "2"whendto:ShyGenYinDto(yz == "助", hz == "助", tghhybyp == "0", tgybyp == "0")thendto.setResult("弱");dto.setDesc("根根在年支、时支,天干不是印比一片(包括合化)");
endrule "年支根,月支泄根一次,本气透干"salience 65439activation-group "4"whendto:ShyGenYinDto(yz == "助", mz == "泄", bqtg == "1")thendto.setResult("弱");dto.setDesc("年支根,月支泄根一次,本气透干");
end// rule values at B106, header at B4
rule "年支根,月支泄根一次,合化本气透干"salience 65438activation-group "4"whendto:ShyGenYinDto(yz == "助", mz == "泄", hhbqtg == "1")thendto.setResult("弱");dto.setDesc("年支根,月支泄根一次,合化本气透干");
end

解决规则冲突,另外的办法,就是就规则设置更加清晰,问题也就能解决。比如把某些规则的值设置的更加清晰一些

八字命理应用drools规则引擎相关推荐

  1. 调研规则引擎用于八字命理

    熟悉命理书的朋友都知道,书上计划都是一些条文组成的断语,从下表可以看到,命理大师们习惯描述什么条件,会出现什么样的情况,这样看起来是不是很像规则引擎的职能呢?于是我就想调研一下java相关的规则引擎, ...

  2. drools规则引擎可视化_一文看懂开源工作流引擎 Flowable「转」

    原文链接:[https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c]. 一.工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能,一个最常见 ...

  3. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

  4. 使用 Drools 规则引擎实现业务逻辑,可调试drl文件

    http://www.srcsky.com/tech/arts/389.html 代码下载http://download.csdn.net/detail/zhy011525/2462313 使用 Dr ...

  5. drools规则引擎因为内存泄露导致的内存溢出

    进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...

  6. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...

  7. SpringBoot整合Drools规则引擎动态生成业务规则

    最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...

  8. drools规则引擎 java_Drools规则引擎的使用总结

    前一段时间在开发了一个做文本分析的项目.在项目技术选型的过程中,尝试使用了Drools规则引擎.让它来作为项目中有关模式分析和关键词匹配的任务.但后来,因为某种原因,还是撇开了Drools.现将这个过 ...

  9. 大数据风控项目实战 Drools规则引擎

    可以借鉴的干货 1,统一存储服务,包含:多种存储库连接封装和服务封装 在统一存储服务 2.获取配置的环境 类:EnvVariable 一.风控项目介绍 对一个复杂支付系统提供统一.全面.高效的风险控制 ...

最新文章

  1. 组合特征(二)tfidf(word+article)+lsa
  2. innerText与innerHTML的区别
  3. 不是HR,Leader你会面试应聘者吗
  4. 聊一下我们团队的理念
  5. opython3l_Python从小白到攻城狮(3)——列表和元组,到底用哪个?
  6. Sentinel集群流控
  7. jdk12 jdk1.8_JDK 12的Files.mismatch方法
  8. 处理移动端pdf展示问题
  9. Lua: 给 Redis 用户的入门指导
  10. java redis hash存取_我爱java系列---【redis中如何存取hash类型的值(key field value)】...
  11. Mysql的简单使用(二)
  12. int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”
  13. 【秒懂音视频开发】16_AAC解码实战
  14. Python(PyCharm)的下载安装汉化(2022)
  15. 2021有什么好的入耳式耳机推荐?耳机热销性价比牌子排行榜单推荐!
  16. 和林格尔新区打造先进算力的“蓄水池”
  17. 打卡赠书的几点重要说明
  18. cscd期刊是c刊吗_武工商C刊和北大核心期刊论文发表数量位列全省同类高校前三甲...
  19. 时空日期审核错误修正
  20. NX二次开发-UFUN读取图纸尺寸的值UF_DRF_ask_dimension_text

热门文章

  1. Selector.select()
  2. (step4.3.6)hdu 2660(Accepted Necklace)
  3. 绕过CSP之Dangling markup技术
  4. Y05 - 001、Python是什么?
  5. 智能手机场景展示音乐可视化AE模板
  6. 使用CSS将图片转换成黑白(灰色、置灰)
  7. shell 中利用sqlplus 执行sql脚本 传参
  8. 人口普查数据集独热编码转换
  9. 基于Gabor纹理特征的图像检索
  10. 考计算机二级能带帽子吗,教资报名要注意这几点,否则无法通过审核,考区问题最容易出错...