Drools 决策表 - 规则不匹配

如何解决Drools 决策表 - 规则不匹配

我有一个 hello-world 类型的 spring/drools 设置。问题是没有规则在理论上应该发生。

决策表:

enter image description here

控制台输出 - 服务器启动:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?