欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Drools记录执行的规则

程序员文章站 2022-05-28 11:09:53
...

通过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())输出执行到的规则名