将类对象传递到Drools规则(drt)文件

将类对象传递到Drools规则(drt)文件,drools,kie,Drools,Kie,我使用Drools模板进行决策,我创建了类的实例,并使用insert将类对象传递给Kie会话 在drt文件中,我尝试将模板列与类对象进行比较,并且某些参数已超过阈值,然后根据模板文件中的值设置优先级 模板文件的格式(Excel) 在另一个类中,我启动会话并注入capacity类对象并加载模板文件 流口水 规则文件 template header Parameter Mountpoint Threshold Severity package com.test.drools; dialect "

我使用Drools模板进行决策,我创建了类的实例,并使用insert将类对象传递给Kie会话

在drt文件中,我尝试将模板列与类对象进行比较,并且某些参数已超过阈值,然后根据模板文件中的值设置优先级

模板文件的格式(Excel)

在另一个类中,我启动会话并注入capacity类对象并加载模板文件 流口水

规则文件

template header
Parameter
Mountpoint
Threshold
Severity

package com.test.drools;

dialect "java"

template "OperationalMeasurement"

rule "Check_Threshold_@{row.rowNumber}"
ruleflow-group "capacityManagement"
salience 500
when
   $capacity: Capacity(component == "@{Parameter}" && subComponent == "@{Mountpoint}" && value >= "@{Threshold}")
  then   
    System.out.println("Thresold cross for Component and Priority is set " + @{Severity}"); 
end
end template
当我运行这个组件时,它被视为文本字符串而不是容量类变量,尽管我没有得到任何错误,但它只是在控制台中打印drt文件的所有内容。 而且我似乎没有得到Sysout语句

组件被视为文本字符串,而不是容量类变量

不知道你说的是什么意思。什么“组件”被视为文字

根据作为注释添加的生成规则,生成的规则中存在一些错误:

    System.out.println("Thresold crossed for Component::" +component + " and Priority is set " + Major"); 
在上面的一行中,“component”应该是一个变量,但没有具有该名称的变量。“主”字符串前还有一个缺少的引号。 我建议您将模板更改为以下内容:

rule "Check_Threshold_@{row.rowNumber}"
ruleflow-group "capacityManagement"
salience 500
when
   $capacity: Capacity(component == "@{Parameter}" && subComponent == "@{Mountpoint}" && value >= "@{Threshold}")
  then   
    System.out.println("Threshold cross for Component:: @{Parameter} and Priority is set to @{Severity}"); 
end
end template
这将生成有效的DRL

另一件值得一提的事情是,由于一些我从未完全理解的奇怪原因,如果您的知识库中存在错误(即DRL文件中的错误),Drools不会抱怨。在使用知识库之前,您必须自己检查错误。
KnowledgeBuilder
类有一个
hasrerrors()
方法和一个
getResults()
方法,可以用来检查错误。如果您使用的是
容器
,则可以使用
verify()
方法。您如何将DRL加载到
KieBase


希望有帮助,

模板展开后,请至少粘贴一条生成的规则,好吗?我还注意到,您正在模板中使用
规则流组
,但在执行
会话
时从未激活它。这是故意的吗?@EstebanAliverti..这是输出'c.b.d.a.capacity.capacityEventHandler:package com.test.drools;方言“java”导入com.test.drools.Capacity;当$capacity:capacity(组件==“磁盘”&&subComponent==“/tmp”&&value>=90)时,规则“Check_Threshold_2”显著性为500,然后是System.out.println(“组件::“+component+”,优先级设置为“+Major”);endIt只是打印整个规则文件的内容,只是它代替了模板字段,它用模板中的实际值替换,如果模板中有两条记录,规则会被触发两次。此外,我从drl文件中删除了ruleflow组,结果仍然一样
    System.out.println("Thresold crossed for Component::" +component + " and Priority is set " + Major"); 
rule "Check_Threshold_@{row.rowNumber}"
ruleflow-group "capacityManagement"
salience 500
when
   $capacity: Capacity(component == "@{Parameter}" && subComponent == "@{Mountpoint}" && value >= "@{Threshold}")
  then   
    System.out.println("Threshold cross for Component:: @{Parameter} and Priority is set to @{Severity}"); 
end
end template