首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Drools记要执行的规则

2012-09-01 
Drools记录执行的规则通过debug跟踪Drools的执行源码,实现执行规则的记录(输出)功能。?在ksession.fireAllR

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

?

热点排行