作者:littlelove 来源:LiveSpace   酷勤网收集 2007-08-29

摘要
  jBMP3.0的文档在我看来有点简单,把文档从头看完,还是有点无从下手的感觉,带的几个例子也相对简单,先把涉及的相关概念,按自己的理解整理一下。
jBPM是比较流行的工作流引擎之一。
提供比较灵活的机制来实现工作流引擎。
jBPM的下载地址为:
http://www.jboss.com/products/jbpm/downloads 
可以下载到jBMP的开发包、在jBoss服务器下的部署环境、以及eclipse下的定义流程的工具。

jBMP3.0的文档在我看来有点简单,
把文档从头看完,还是有点无从下手的感觉,
带的几个例子也相对简单,
先把涉及的相关概念,按自己的理解整理一下。
 
还有值得一提的是,jBMP使用hiberanter来做持久层,
也是学习hibernate的使用的好项目。

jBMP主要涉及到以下概念:
process definition:工作流的流程的完整定义,包括节点和节点之间的走向等关键信息。通常以xml格式提供。
process instance:是基于process defination而生成的业务层的实例。当process instancep创建以后,一个token就产生,代表流程的执行路径,并被定义到开始节点。
token:表示了一个执行的路径,它是运行时产生的。
node:表示流程中的一个节点。
transition:关联两个节点,用于表示节点的走向
signal:让一个token执行下一步。
当token进入到一个node时,node会被执行,并产生一些事件,比如进入、离开节点等,这也是执行业务逻辑的地方。事件由action来表示。

再把自己做的一个简单的例子贴上来:
  • process-definition文件

<process-definition name='Decl Definition2'>
 <start-state name='start'>
  <transition to='ComposeBatchValidate' />
 </start-state>
 <state name='ComposeBatchValidate'>
  <event type='node-enter'>
   <action class='org.jbpm.tutorial.DeclComposeBatchAction' />
  </event>
  <transition to='FirstAudit' />
 </state>

 <state name='FirstAudit'>
  <transition to='end' />
 </state>
 <end-state name='end' />
</process-definition>

  • 将process-definition文件持久化到数据库       

        InputStream is = DeclBatchTest.class
                .getResourceAsStream("DeclBillStats.xml");
        ProcessDefinition processDefinition = ProcessDefinition
                .parseXmlInputStream(is);
        JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
        jbpmSession.beginTransaction();
        jbpmSession.getGraphSession().saveProcessDefinition(processDefinition);
        jbpmSession.commitTransaction();
        jbpmSession.close();

  • 生成一个新的process instance

       JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
        jbpmSession.beginTransaction();
        ProcessDefinition processDefinition = jbpmSession.getGraphSession()
                .findLatestProcessDefinition("Decl Definition2");
       
        ProcessInstance processInstance = new ProcessInstance(processDefinition);
        ContextInstance contextInstance =
            processInstance.getContextInstance();
        contextInstance.setVariable("no","1234");
        Token token = processInstance.getRootToken();
        //System.out.println(token.getNode().getName());
        //token.signal();
        //System.out.println(token.getNode().getName());
        //token.signal();
        //System.out.println(token.getNode().getName());
        jbpmSession.getGraphSession().saveProcessInstance(processInstance);
        jbpmSession.commitTransaction();
        jbpmSession.close();

注意:其中的Context,是流程控制和业务逻辑层交换数据的方式。要交换的信息,可以保存在ContextInstance中,并在以后读取此process instance时,及Action的实现类中得到这些信息。

  • 读取已有的process instance

        JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
        jbpmSession.beginTransaction();
        GraphSession graphSession = jbpmSession.getGraphSession();
        ProcessDefinition processDefinition =
            graphSession.findLatestProcessDefinition("Decl Definition2");
        List processInstances =
            graphSession.findProcessInstances(processDefinition.getId());
        System.out.println(processInstances.size());
        for(int i=0;i<processInstances.size();i++){
            ProcessInstance processInstance =
                (ProcessInstance) processInstances.get(i);
            Token token=processInstance.getRootToken();
            token.signal();
            System.out.println(token.getNode().getName());
            ContextInstance contextInstance =
                processInstance.getContextInstance();
            System.out.println(contextInstance.getVariable("no"));
            jbpmSession.getGraphSession().saveProcessInstance(processInstance);

        }
        jbpmSession.commitTransaction();

        jbpmSession.close();

  • action的实现类

action要继承ActionHandler,并提供execute方法。如:
    public void execute(ExecutionContext executionContext) {
        System.out.println("come in");
        System.out.println(executionContext.getContextInstance().getVariable("no"));
    }

分类: 中间件技术 应用服务器技术 Java技术 .NET技术



关于酷勤 | 联系方式 | 免责声明 | 友情链接