我有一个包含10条规则的drl文件。每个都有像 -
这样的条件Rule 1
when
field1 == "X"
then
status == "A"
Rule 2
when
field1 == "Y"
then
status == "A"
因此,基于变量field1
的值,可以执行规则。
现在我有一个包含超过1个值的对象,如List。因此,如果List包含值X和amp; Y,仅应用规则1,然后停止处理。规则2永远不会被触发。
即使1条规则成功,我有什么方法可以让DROOLS继续申请规则吗?
答案 0 :(得分:2)
在类Type中编写与String字段(称为field
)匹配的规则的正确方法是
rule "match field"
when
Type( field == "X" )
then
//...
end
您可以编写另一个与"Y"
匹配的规则,如果您需要执行其他操作,则会显示该规则。如果你想这样做,你可以写一个稍微复杂的测试:
rule "match field"
when
Type( field == "X" || == "Y" )
then
//...
end
(是的,在Drools' DRL语言中允许使用这种不寻常的语法。)
要测试List中包含的值,可以编写
rule "match list element"
when
List( this contains "X" )
then
//...
end
同样,您可以编写另一个测试contains "Y"
的规则,只要List<String>
包含"X"
和"Y"
,它就会触发。< / p>
作为工作记忆中的事实,裸名单通常不是一个好主意。但是如果类成员是List,则可以使用类似的形式:
rule "match value in list member"
when
Type( list contains "X" )
then
//...
end
不需要针对多个规则触发采取特殊预防措施。标准激活session.fireAllRules()
将触发,直到所有激活都已处理完毕。
某些规则属性可能会过早终止激活处理 - 谨慎使用它们。
答案 1 :(得分:0)
尝试在Drools会话中调用fireAllRules();
。
它为您提供以下差异:
fireAllRules();
fireAllRules(AgendaFilter agendaFilter)
fireAllRules(AgendaFilter agendaFilter, int max)
fireAllRules(int max)
在最后两个差异中,max
是要触发的规则的上限。在您的示例中,如果您使用max作为10
,则只要符合条件,它就会触发所有10条规则。
请注意:应根据更新后的状态配置规则,使其符合执行条件。请求您查看criteria
片段(规则的when
条款,并确保它们确实在执行期间得到正面评估。
e.g。如果规则如下所示:
Rule 1
when
field1 == "X"
then
status == "A"
Rule 2
when
field1 == "Y"
then
status == "A"
然后field1 == "X"
为真或field1 == "Y"
为真,因此会在MAX
触发一条规则。
但是如果我们写出像
这样的规则Rule 1
when
field1 == "X" || field1 == "Y"
then
status == "A"
Rule 2
when
field1 == "X" || field1 == "Y"
then
status == "A"
如果Rule 1
为Rule 2
或field1
,则X
和Y
这两项规则都有资格。
希望这有帮助。
答案 2 :(得分:-1)
我会给你一些不同的答案,因为我不知道什么是流口水,但我可以告诉你我们是如何用其他语言做的。基本上它需要字符串构建器概念和一些逻辑触点更改。
设置字符串:
string yourLongerStatusStringSetter = '';
完成检查并附加字符串:
规则1 when field1 == "X" then yourLongerStatusStringSetter &= "Meets Status A criteria."
规则2 when field1 == "Y" then yourLongerStatusStringSetter &= " Meets Status B criteria."
继续规则,检查和追加(符合条件)
输出您的状态&#39;
howeverYouWriteYourOutput( yourLongerStatusStringSetter )
将打印到屏幕上:
Meets Status A criteria. Meets Status B criteria
只是在另一种方法上思考。