我有一个包含10条规则的drl文件。每个都有一个条件,比如-
Rule 1
when
field1 == "X"
then
status == "A"
Rule 2
when
field1 == "Y"
then
status == "A"
所以根据变量field d1
的值看到规则将被执行。
现在我有一个包含超过1个值的对象,例如List。所以如果List包含两个值X
有什么方法可以让DROOLS继续应用规则,即使一个规则是成功的?
编写与类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
同样,您可以编写另一个规则来测试是否包含“Y”
,只要List
工作记忆中的裸列表通常不是一个好主意。但是如果一个类成员是一个List,可以使用类似的形式:
rule "match value in list member"
when
Type( list contains "X" )
then
//...
end
对于多个规则触发不需要采取特殊的预防措施。标准激活session. fire All规则()
触发,直到所有激活都被处理完。
一些规则属性可能会过早终止激活的处理——谨慎使用它们。
尝试调用fire All规则(); Drools会话中可用的
。
它为您提供以下差异:
fireAllRules();
fireAllRules(AgendaFilter agendaFilter)
fireAllRules(AgendaFilter agendaFilter, int max)
fireAllRules(int max)
在最后两个方差中,max
是要触发的规则的上限。在您的示例中,如果您使用max作为10
,它可以触发所有10条规则,前提是它们满足条件。
请注意:规则的配置方式应使其有资格根据更新的状态执行。要求您查看规则的标准
片段(规则的时
子句,并确保它们在执行期间确实导致正面评估。
例如。如果规则如下所示:
Rule 1
when
field1 == "X"
then
status == "A"
Rule 2
when
field1 == "Y"
then
status == "A"
然后field d1=="X"
为真或field d1=="Y"
为真,因此将在MAX
触发一条规则。
但是如果我们把规则写成
Rule 1
when
field1 == "X" || field1 == "Y"
then
status == "A"
Rule 2
when
field1 == "X" || field1 == "Y"
then
status == "A"
然后,如果field d1
是X
或Y
,则规则1和规则2
都将符合条件。
希望这有帮助。
我要给你一个不同的答案,因为我不知道drools是什么,但我可以告诉你我们在其他语言中是如何做到这一点的。基本上它需要一个字符串生成器概念和一些逻辑接触点的变化。
设置您的字符串:
string yourLongerStatusStringSetter = '';
完成检查并附加字符串:
规则1当field d1=="X"时,则yourLongerStatusStringSetter
规则2当field d1=="Y"时,则yourLongerStatusStringSetter
继续规则和检查并追加(前提是满足条件)
输出您的“状态”:
无论如何YouWriteYourOutput(yourLongerStatusStringSetter)
将打印到屏幕上:
符合A级标准。符合B级标准
只是另一种方法的思考食粮。