论坛首页 Java版 企业应用

jBpm的Event

浏览 345 次
该帖已经被评为隐藏帖
作者 正文
最后更新时间:2007-10-06 关键字: bpm, java, jbpm ,workflow ,工作流, j2ee

作者:胡长城

    在阅读此篇文档的时候,首先需要对jBpm有些了解。好歹知道jBpm最主要的基本元素就是三个:StateActionTransition

       State相当于我们通常所说的Task,而Transition则有根XPDLTransition很类似了。那么Action呢?

       jBpm我想,其最大的特色就是提供了一套比较简单但是很实用的EventAction)处理机制。不过,这套Event依然还有很多缺陷,比如不能自定义Event Type(这个通常是有些用处的),不能热部署(或插入)等等,而且只适合后台程序调用的执行。

      

       jBpm jPDL所描述的主要几个元素,大多都可以挂Action(一个或多个),除了End-State(结束位置)。相应信息规则可以参考http://jbpm.org/2/jpdl.html (最好首先仔细读读)。

      

       jBpm描述这样的许可:在流程运行的不同时期、不同地点,可能会激活特定的Event。而这特定的Event是由一系列类型相的Action组成的。jBpm提供这些Action底层接口,而开发者可以根据这个接口,来实现具体的执行体

 

       这个最基本的接口就是org.jbpm.delegation.ActionHandler

public interface ActionHandler {

  void execute( ExecutionContext executionContext );

}

 

       jBpm提供了一些EventType(很不爽的是,开发者必须遵循这些EventType),即使你在你个流程定义xml文件中没有为某一个元素(比如Transtion)中的Action指明类型,但是在流程定义加载的时候,会将这些没有指明的Action,根据其当前所在的元素,而赋予默认的类型。

       下面这个例子,是TransitionImplTranstion所对应的对象)所为其下的Action提供了默认“动作类型”

  public EventType getDefaultEventType() {

    return EventType.TRANSITION;

  }

 

       那么,jBpm提供了哪些Event类型呢?

       具体可以参考一下 EventType类的javadoc

             http://jbpm.org/2/javadoc/org/jbpm/model/definition/EventType.html

      

       那么这些的action是在哪儿调用的,以及如何调用的呢?

       比如,一个state元素允许定义三种EventTypeSTATE_ENTERSTATE_AFTER_ASSIGNMENTSTATE_LEAVE

       那么引擎在执行时,当一个token transition移到其所连接的State,并被这个State所接受的时候,其就会激活这个State对象的acceptToken方法(参见StateImpl类)。而在这个acceptToken方法中,就需要执行 EventTypeSTATE_ENTERSTATE_AFTER_ASSIGNMENT的所有Action

 

    下框显示了如何调用action的执行:

  public void acceptToken(ExecutionContextImpl executionContext)

throws ExecutionException {

    ······

    executeActions( EventType.STATE_ENTER, executionContext );

    ······

    executeActions( EventType.STATE_AFTER_ASSIGNMENT, executionContext );

  }

说到这儿,估计即使我不说了,想来也可以猜到jBpm是如何处理的···

下面让我们来看看着个executeActions方法,其是在ElementImpl这个基类中。

public void executeActions( EventType eventType,

ExecutionContextImpl executionContext ) throws DelegationException {  

TokenImpl token  = (TokenImpl) executionContext.getToken();

Iterator iter = actions.iterator();

        while (iter.hasNext()) {

            ActionImpl action = (ActionImpl) iter.next();

      if ( eventType == action.getEventType() ) {

        action.execute( executionContext );

      }

        }

  }

 


   
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐