Я все еще новичок в слюнях (используя 6.2), но меня озадачила, казалось бы, простая проблема.
Проблема: у меня есть несколько правил, из которых следует применить не более одного. Другими словами, после применения одного из правил предложение «когда» больше не должно оцениваться как истинное.
package xyz
import xyz.EvaluationResults;
import xyz.ExclusivenessTestFact;
rule "ExclusivenessTest Rule 1"
salience 10
when
$exclusivenessFact : ExclusivenessTestFact()
$evaluationResults : EvaluationResults(exclusiveRuleApplied == false)
then
$evaluationResults.addResult("TR1","TR1");
$evaluationResults.setExclusiveRuleApplied(true);
end
Идея правила заключается в том, что после применения первого правила флаг ExclusiveRuleApplied устанавливается в значение true, и, следовательно, другие оцениваемые правила больше не должны оцениваться как true. (не уверен, что это лучший подход, но это лучшее, что я мог придумать)
У меня есть несколько таких правил (сейчас 4), и я добавляю по одному из каждого факта в сеанс и вижу с помощью точек останова и отладки, что метод получения EvaluationResults.getExclusiveRuleApplied() оценивается только один раз (в то время как метод установки вызывается четыре раза, поэтому все правила применяются).
Я использую сеанс с отслеживанием состояния, и ниже приведен мой класс EvaluationResults (после примера «Состояние» из примеров слюней). Я не уверен, что мне не хватает, я нигде не вижу, чтобы свойствоChangeListener добавлялось (также нет в примерах), поэтому не уверен, как это должно работать на диалекте Java? Возможно, мне не хватает некоторых настроек механизма правил, я использую сеансы с отслеживанием состояния и потоковую передачу в качестве режима обработки событий (хотя на самом деле не знаю, что это такое).
package xyz
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import java.util.Map;
public class EvaluationResults
implements java.io.Serializable
{
private Boolean exclusiveRuleApplied;
private Map<String,Object> results;
private final PropertyChangeSupport changes = new PropertyChangeSupport(this);
public EvaluationResults()
{
// default constructor
}
public Object addResult(final String key, final Object result)
{
return results.put(key, result);
}
public void setExclusiveRuleApplied(Boolean exclusiveRuleApplied)
{
Boolean oldState = this.exclusiveRuleApplied;
this.exclusiveRuleApplied = exclusiveRuleApplied;
// each fact change gets propagated via Java Beans PropertyChangeEvents
this.changes.firePropertyChange( "exclusiveRuleApplied",
oldState,
exclusiveRuleApplied );
}
public Boolean getExclusiveRuleApplied()
{
return exclusiveRuleApplied;
}
public void setResults(Map<String,Object> results)
{
Map<String,Object> oldState = this.results;
this.results = results;
// each fact change gets propagated via Java Beans PropertyChangeEvents
this.changes.firePropertyChange( "results",
oldState,
results );
}
public Map<String,Object> getResults()
{
return results;
}
@Override
public boolean equals(Object obj)
{
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public int hashCode()
{
return HashCodeBuilder.reflectionHashCode(this);
}
public void addPropertyChangeListener(final PropertyChangeListener l) {
this.changes.addPropertyChangeListener( l );
}
public void removePropertyChangeListener(final PropertyChangeListener l) {
this.changes.removePropertyChangeListener( l );
}
}
Рад услышать любые идеи. Спасибо!
update
. stackoverflow.com/questions/14507633 / - person Marko Topolnik   schedule 25.07.2015