`
xiaoye4188
  • 浏览: 30616 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Drools记录执行的规则

 
阅读更多

通过debug跟踪Drools的执行源码,实现执行规则的记录(输出)功能。

 

在ksession.fireAllRules();  进入类StatefulKnowledgeSessionImpl.fireAllRules()中

 

类StatefulKnowledgeSessionImpl主要涉及的成员变量及方法:

 

public ReteooWorkingMemory session;
public int fireAllRules() {
          return this.session.fireAllRules();
}

 

 其中ReteooWorkingMemory 继承自AbstractWorkingMemory

 故上面return 调用的是AbstractWorkingMemory的fireAllRules()方法

 

AbstractWorkingMemory主要涉及的成员变量及方法:

 

protected InternalAgenda agenda;

public synchronized int fireAllRules() throws FactException {
          return fireAllRules( null, -1);
}

public synchronized int fireAllRules(final AgendaFilter agendaFilter,
                                         int fireLimit) throws FactException {
        if ( isSequential() ) {
            for ( Iterator it = this.liaPropagations.iterator(); it.hasNext(); )                
            {
                ((LIANodePropagation) it.next()).doPropagation( this );
            }
        }

        // do we need to call this in advance?
        executeQueuedActions();

        int fireCount = 0;
        if ( this.firing.compareAndSet( false, true ) ) {
            try {
                fireCount = this.agenda.fireAllRules( agendaFilter,fireLimit);
            } finally {
                this.firing.set( false );
            }
        }
        return fireCount;
    }

调用了agenda.fireAllRules()方法,而DefaultAgenda实现了InternalAgenda接口

 

类DefaultAgenda所涉及的方法:

 

public int fireAllRules(AgendaFilter agendaFilter, int fireLimit) {
        this.halt.set( false );
        int fireCount = 0;
        while ( continueFiring( fireLimit ) &&fireNextItem( agendaFilter )) {
            fireCount++;
            fireLimit = updateFireLimit( fireLimit );
            this.workingMemory.executeQueuedActions();
        }
        if ( this.focusStack.size()==1 && getMainAgendaGroup().isEmpty() )    
        {
            getMainAgendaGroup().setActive( false );
        }
        return fireCount;
    }

其中fireNextItem方法如下:
public boolean fireNextItem(final AgendaFilter filter) throws ConsequenceException {
        boolean tryagain, result;
        do {
            tryagain = result = false;
            final InternalAgendaGroup group = (InternalAgendaGroup) getNextFocus();
            // if there is a group with focus
            if ( group != null ) {
                final AgendaItem item = (AgendaItem) group.getNext();
                // if there is an item to fire from that group
                if ( item != null ) {
                    // if that item is allowed to fire
                    if ( filter == null || filter.accept( item ) ) {
                        // fire it
                  System.out.println(item.getRule().getName()); //输出执行的规则名
                  fireActivation( item );
                        result = true;
                    } else {
                        // otherwise cancel it and try the next
                        final EventSupport eventsupport = (EventSupport)  this.workingMemory;             eventsupport.getAgendaEventSupport().fireActivationCancelled( item,                                                                             this.workingMemory,                                                                                    ActivationCancelledCause.FILTER );
                        tryagain = true;
                    }
                }
            }
        } while ( tryagain );
        return result;
    }

   使用ystem.out.println(item.getRule().getName())输出执行到的规则名

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics