我正在使用Drools 4,当我将两个hashmap值与==进行比较时,它无效。所有其他运营商,如> =,< =,<,>,!=正常运行。我比较如下。我使用地图作为。声明有什么问题吗?地图值将在规则的操作中更新。我能够在地图中看到更新的值,但值的比较失败。我正在使用update(abc)来更新值。
eval((abc.getValue(" 123"))。intValue()==(abc.getValue(" 456"))。intValue())
规则:
rule "008"
salience -18
agenda-group "CAP"
auto-focus true
when
testObj: TestObj(eval(fireNextPriority==true), categoryCount==18,
eval(!firedRules.contains(Integer.valueOf(23449)))
&& (date >= 1263925800000)
&& (date <= 4102338600000) && (date >= 1263925800000) && (date <= 4102338600000)
&& eval(1 == 1)
&& eval(testObj.getVariableValue("C1TC") == testObj.getVariableValue("Y1TC")))
then
System.out.println("Firing rule: CAP - 008");
testObj.setStatus(true);
testObj.setPriority(1);
testObj.addToFiredRules(23449);
update(testObj);
testObj.addVariableValue("C1PC", testObj.getVariableValue("C1PC")-
testObj.getVariableValue("C1OF"));
end
我们正在使用的对象:
public class TestObj{
Long date;
Integer categoryCount;
boolean status = false;
boolean executeFinalRule = false;
boolean executeFinalRuleForCatg = true;
boolean fireNextPriority = true;
Set<Integer> firedRules = new HashSet<Integer>();
private int priority;
Map<String, Integer> variableValues = new HashMap<String, Integer>();
public Integer getCategoryCount() {
return categoryCount;
}
public void setCategoryCount(Integer categoryCount) {
this.categoryCount = categoryCount;
}
public void increaseCategoryCount(){
this.categoryCount++;
}
public void addVariableValue(String variableCode, Integer count){
if (count < 0) count = 0;
this.variableValues.put(variableCode, count);
}
public Integer getVariableValue(String variableCode){
Integer value = this.variableValues.get(variableCode);
return value == null? 0 : value;
}
public boolean isStatus() {
return status;
}
public Set<Integer> getFiredRules() {
return firedRules;
}
public void setFiredRules(Set<Integer> firedRules) {
this.firedRules = firedRules;
}
public void addToFiredRules(int l){
this.firedRules.add(l);
}
}
提前致谢。
答案 0 :(得分:0)
我从未使用过Drools 4.x,所以这些都是基于我对5.1.1的(旧)知识的观察 - 在你的情况下它们可能不准确。
eval(fireNextPriority==true)
这很有效。 eval
不保持封闭模式的上下文(事实),所以通常你必须写
eval(!firedRules.contains(Integer.valueOf(23449))
同样的事情。
eval(testObj.getVariableValue("C1TC") == testObj.getVariableValue("Y1TC"))
这是我从5.1开始编写的。
奇怪的是
testObj.addVariableValue("C1PC", testObj.getVariableValue("C1PC")
testObj.getVariableValue("C1OF"));
(我在编辑的过程中对此进行了解答?) update
调用后,这些更改是,这意味着引擎无法看到它们。地图条目“C1TC”和/或“Y1TC”的更新是否已在另一条规则中同样完成?然后,即使他们是Java,他们也不会等于Drools ......