I'm using Drools 7.6 and for some reason @watch doesn't stop the rule from reactivating itself or other rules when only the unwatched property is changed. Which results in an infinite loop.
Can someone figure out what am I doing wrong?
The rule:
package com.model import com.model.*; import java.util.List; rule "10% for 15 High-range Items" when $o: Order($lines: orderLines) @watch(!discount) Number(intValue >= 15) from accumulate( OrderLine($item: item, $q: quantity) from $lines and Item(category == Item.Category.HIGH_RANGE) from $item, sum($q) ) then modify($o) {increaseDiscount(0.10)} end
The model used is from the book Mastering JBoss Drools. The method increase discount has been annotated with @Modifes. The order class:
public class Order implements Serializable { private static final long serialVersionUID = 1L; private Long orderId; private Date date; private Customer customer; private List<OrderLine> orderLines = new ArrayList<>(); private Discount discount; public Order() { } public Long getOrderId() { return orderId; } public void setOrderId(Long orderId) { this.orderId = orderId; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public List<OrderLine> getOrderLines() { return orderLines; } public void setItems(List<OrderLine> orderLines) { this.orderLines = orderLines; } public double getTotal() { return this.getOrderLines().stream() .mapToDouble(item -> item.getItem().getSalePrice() * item.getQuantity()) .sum(); } public int getTotalItems() { return this.getOrderLines().stream() .mapToInt(item -> item.getQuantity()) .sum(); } @Modifies({"discount"}) public void increaseDiscount(double increase) { if (discount == null) { discount = new Discount(0.0); } discount.setPercentage(discount.getPercentage() + increase); } public Discount getDiscount() { return discount; } public double getDiscountPercentage() { return discount.getPercentage(); } public void setDiscount(Discount discount) { this.discount = discount; } }
- clones
-
DROOLS-2427 Drools @Watch not working with accumulate in code
- Closed