drools (6.2) факт не переоценивается в сеансе с отслеживанием состояния

Я все еще новичок в слюнях (используя 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 );
    }

}

Рад услышать любые идеи. Спасибо!


person Sebastian    schedule 25.07.2015    source источник
comment
Вы должны update. stackoverflow.com/questions/14507633 /   -  person Marko Topolnik    schedule 25.07.2015
comment
о боже ... это было на удивление просто (хотя я прочитал некоторые руководства, должно быть, проглядел это). Спасибо @MarkoTopolnik! Если вы добавите ответ, я приму его.   -  person Sebastian    schedule 25.07.2015


Ответы (1)


Механизм Drools не определяет автоматически, когда вы изменили факт. Поэтому вы должны явно вызвать update($evaluationResults), чтобы уведомить его и заставить его переоценить условия всех других правил.

person Marko Topolnik    schedule 25.07.2015