如何解决在 Drools:当比赛被判定无用时如何取消规则火?
这种情况是:
- 获得与 DefaultAgendaEventListener 的 BeforeMatchFiredEvent 的匹配
- 判断比赛没用
- 我想取消规则,该怎么做?
感谢您的帮助!
解决方法
您更改了规则,使其在匹配无效时不会触发。
简单的例子——原来的规则是这样的:
rule "Shirt is blue"
when
Shirt(color == "blue")
then
end
在这种情况下,当衬衫也是 XL 码时,这场比赛“毫无用处”。因此,我们只需将规则定义更改为不允许使用 XL 衬衫。
rule "Shirt is blue (but not XL)"
when
Shirt(color == "blue",size != "XL")
then
end
或者,您可以使用标志/标记并检查它们的存在。这是一个简单的例子,我们通过某种昂贵的调用来解决问题......
rule "Determine football jersey sale price"
when
$tournamentWinner: String()
$jersey : Jersey( price == null,team != $tournamentWinner )
then
$jersey.setPrice(19.99)
end
rule "Determine tournament winner"
salience 1
when
not(String())
$service: TeamDataService()
then
// assume this is an expensive call:
String $tournamentWinner = $service.getTournamentWinner()
// insert the results into working memory so the other 2 rules are now valid
insert($tournamentWinner)
end
rule "Special price for tournament winner"
when
$tournamentWinner: String()
$jersey: Jersey( price == null,team == $tournamentWinner)
then
$jersey.setPrice(25.00)
end
... 或者你可以直接修改工作记忆使规则不再有效:
rule "Apply discount"
when
$discount: Discount()
$cart: Cart( total > 0 )
then
$cart.apply($discount)
end
rule "Remove expired discounts"
salience 1
when
$discount: Discount(expired == true)
then
// Since the discount will no longer be in working memory,the other rule's match
// will be cancelled
retract($discount)
end
如果您尝试使用侦听器来修改匹配项,您最终会遇到并发修改异常。听众聆听;他们不会修改。
如果您需要一个不匹配的规则,您需要编写它以使其不匹配。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。