-
Type:
Bug
-
Status: Verified (View Workflow)
-
Priority:
Major
-
Resolution: Done
-
Affects Version/s: 7.0.0.GA
-
Fix Version/s: 7.0.1.GA
-
Component/s: None
-
Labels:None
-
Target Release:
-
Fix Build:CR1
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;
|
}
|
}
|
- cloned from
-
DROOLS-2427 Drools @Watch not working with accumulate in code
-
- Resolved
-