如何解决Drools 决策表 - 规则不匹配
我有一个 hello-world 类型的 spring/drools 设置。问题是没有规则在理论上应该发生。
决策表:
控制台输出 - 服务器启动:
0 00:16:02 AM
1 00:17:45 AM
2 00:18:57 AM
3 00:20:23 AM
Drools 配置:
package com.example.drools;
//generated from Decision Table
import com.example.drools.TestRules;
// rule values at B9,header at B4
rule "_9"
when
$test:TestRules(number1 == 10)
then
$test.add("10");
end
服务:
@Configuration
public class DroolsConfiguration
{
private final static String VALIDATION_RULES = "validation-rules.xls";
@Bean
public KieContainer validationRulesKieContainer() {
KieServices kieServices = KieServices.Factory.get();
Resource rules = ResourceFactory.newClassPathResource(VALIDATION_RULES);
compileXlsToDrl(rules);
KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(rules);
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
KieBuilder builder = kieBuilder.buildAll();
KieModule kieModule = kieBuilder.getKieModule();
return kieServices.newKieContainer(kieModule.getReleaseId());
}
private static void compileXlsToDrl(Resource resource) {
try {
InputStream is = resource.getInputStream();
SpreadsheetCompiler compiler = new SpreadsheetCompiler();
String drl = compiler.compile(is,InputType.XLS);
System.out.println(drl);
} catch (Exception e) {
e.printstacktrace();
}
}
}
TestRule - 事实:
@Service
public class ValidationRulesEngine
{
@Autowired
@Qualifier("validationRulesKieContainer")
private KieContainer validationKieContainer;
public void validate() {
KieSession kieSession = validationKieContainer.newKieSession();
kieSession.addEventListener(new DebugAgendaEventListener());
kieSession.addEventListener(new DebugRuleRuntimeEventListener());
TestRules tr = new TestRules(10,20,30);
kieSession.insert(tr);
int noOfRulesFired = kieSession.fireAllRules();
System.out.println("noOfRulesFired: " + noOfRulesFired);
System.out.println(tr);
System.out.println(tr.getRule());
}
}
控制台输出 - 结果:
public class TestRules
{
public int number1;
public int number2;
public int number3;
public List<String> rules = new ArrayList<String>();
public TestRules() {}
public TestRules(int number1,int number2,int number3)
{
super();
this.number1 = number1;
this.number2 = number2;
this.number3 = number3;
}
public void add(String rule) {
rules.add(rule);
}
public String getRule() {
return this.rules.size() > 0 ? this.rules.get(0) : "";
}
@Override
public String toString()
{
return "TestRules [number1=" + number1 + ",number2=" + number2 + ",number3=" + number3 + ",rules=" +
rules.stream().map(s -> s.toString()).collect(Collectors.joining(",")) + "]";
}
}
我错过了什么?
解决方法
这不好:
$test:TestRules($test.number1 == 10,$test.number2 == 20)
在声明之前不能引用 $test
。正确的语法是:
$test: TestRules( number1 == 10,number2 == 20 )
将您的决策表从 $test.number1 == $param
改为 number1 == $param
。 (对 number2
相邻的也做同样的事情。)
其余的看起来不错,但我建议在您的 XLSX 解析方法中使用 try-with-resources 而不是 try-catch。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。