`
chenjin
  • 浏览: 163613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jbpm 与 工作流模式 基本控制模式(一)

    博客分类:
  • java
阅读更多
     工作流模式

     本文以jdpl/jar/src/test/java   jbpm3 关于workflow patterns 说明 jbpm 对 workflow patterns 的实现示例.

    基本控制模式 (Basic Control Flow Patterns)

    顺序 (sequence)
    Description :     An activity in a workow process is enabled after the completion of another
                            activity in the same process.
    描述:            :    同一个流程中, 一个活动在其他活动完成以后才能发生. 

   同义词        :       Sequential routing, serial routing.
    
   
java 代码
 
  1. /* 
  2.  * JBoss, Home of Professional Open Source 
  3.  * Copyright 2005, JBoss Inc., and individual contributors as indicated 
  4.  * by the @authors tag. See the copyright.txt in the distribution for a 
  5.  * full listing of individual contributors. 
  6.  * 
  7.  * This is free software; you can redistribute it and/or modify it 
  8.  * under the terms of the GNU Lesser General Public License as 
  9.  * published by the Free Software Foundation; either version 2.1 of 
  10.  * the License, or (at your option) any later version. 
  11.  * 
  12.  * This software is distributed in the hope that it will be useful, 
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
  15.  * Lesser General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public 
  18.  * License along with this software; if not, write to the Free 
  19.  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 
  20.  * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 
  21.  */  
  22. package org.jbpm.jpdl.patterns;  
  23.   
  24. import junit.framework.TestCase;  
  25.   
  26. import org.jbpm.graph.def.ProcessDefinition;  
  27. import org.jbpm.graph.exe.ProcessInstance;  
  28. import org.jbpm.graph.exe.Token;  
  29.   
  30. /** 
  31.  * http://is.tm.tue.nl/research/patterns/download/swf/pat_1.swf 
  32.  */  
  33. public class Wfp01SequenceTest extends TestCase {  
  34.   
  35.   public void testSequence() {  
  36.     // create a simple definition with 3 states in sequence  
  37.     ProcessDefinition pd = ProcessDefinition.parseXmlString(  
  38.       " <process-definition>"</process-definition>  +  
  39.       "   +  
  40.       "     +  
  41.       "  " +  
  42.       "   +  
  43.       "     +  
  44.       "  " +  
  45.       "   +  
  46.       "     +  
  47.       "  " +  
  48.       "   +  
  49.       "     +  
  50.       "  " +  
  51.       "   +  
  52.       ""  
  53.     );  
  54.   
  55.     ProcessInstance pi = new ProcessInstance( pd );  
  56.     pi.signal();  
  57.     Token token = pi.getRootToken();  
  58.     assertSame( pd.getNode("a"), token.getNode() );  
  59.       
  60.     token.signal();  
  61.     assertSame( pd.getNode("b"), token.getNode() );  
  62.   
  63.     token.signal();  
  64.     assertSame( pd.getNode("c"), token.getNode() );  
  65.   
  66.     token.signal();  
  67.     assertSame( pd.getNode("end"), token.getNode() );  
  68.   }  
  69. }  
 
        <process-definition><start-state name="start"><state name="a"><state name="b"><state name="c">流程定义文件如下

     </state></state></state></start-state></process-definition>
xml 代码
  1. <process-definition>  
  2.     <start-state name='start'>  
  3.         <transition to='a' />  
  4.     <!---->start-state>  
  5.     <state name='a'>  
  6.         <transition to='b' />  
  7.     <!---->state>  
  8.     <state name='b'>  
  9.         <transition to='c' />  
  10.     <!---->state>  
  11.     <state name='c'>  
  12.         <transition to='end' />  
  13.     <!---->state>  
  14.     <end-state name='end' />  
  15. <!---->process-definition>
   节点流程      start --> a --> b --> c --> end
    <process-definition><start-state name="start"><state name="a"><state name="b"><state name="c">
        本例中包括start , a , b ,c ,end 四个node.  token.signal() 可以理解为流程中当前节点(token对应节点) 活动结束. 代码一目了然. 不需要过多解释.
   
    


  并行分支(Parallet Split) 


Description :    A point in the workow process where a single thread of control splits into multiple threads of control which can be executed in parallel, thus allowing activities to be executed simultaneously or in any order.

描述            :     在分支点上,一个工作流程执行线程 分出多个执行线程同时并行执行, 多个分支线程可以同时以任意顺序执行.

同义词:            AND-split, parallel routing, fork.

</state></state></state></start-state></process-definition>
java 代码
  1. /* 
  2.  * JBoss, Home of Professional Open Source 
  3.  * Copyright 2005, JBoss Inc., and individual contributors as indicated 
  4.  * by the @authors tag. See the copyright.txt in the distribution for a 
  5.  * full listing of individual contributors. 
  6.  * 
  7.  * This is free software; you can redistribute it and/or modify it 
  8.  * under the terms of the GNU Lesser General Public License as 
  9.  * published by the Free Software Foundation; either version 2.1 of 
  10.  * the License, or (at your option) any later version. 
  11.  * 
  12.  * This software is distributed in the hope that it will be useful, 
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
  15.  * Lesser General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public 
  18.  * License along with this software; if not, write to the Free 
  19.  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 
  20.  * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 
  21.  */  
  22. package org.jbpm.jpdl.patterns;  
  23.   
  24. import junit.framework.TestCase;  
  25.   
  26. import org.jbpm.graph.def.ProcessDefinition;  
  27. import org.jbpm.graph.exe.ProcessInstance;  
  28. import org.jbpm.graph.exe.Token;  
  29.   
  30. /** 
  31.  * http://is.tm.tue.nl/research/patterns/download/swf/pat_2.swf 
  32.  */  
  33. public class Wfp02ParallelSplitTest extends TestCase {  
  34.   
  35.   public void testParallelSplit() {  
  36.     ProcessDefinition pd = ProcessDefinition.parseXmlString(  
  37.       " <process-definition>"</process-definition>  +  
  38.       "   +  
  39.       "     +  
  40.       "  " +  
  41.       "   +  
  42.       "     +  
  43.       "     +  
  44.       "  " +  
  45.       "   +  
  46.       "   +  
  47.       ""  
  48.     );  
  49.   
  50.     ProcessInstance pi = new ProcessInstance( pd );  
  51.     pi.signal();  
  52.     Token root = pi.getRootToken();  
  53.     assertNotNull( root );  
  54.       
  55.     Token firstToken = root.getChild( "first" );  
  56.     assertNotNull( firstToken );  
  57.     assertSame( pd.getNode("a"), firstToken.getNode() );  
  58.       
  59.     Token secondToken = root.getChild( "second" );  
  60.     assertNotNull( secondToken );  
  61.     assertSame( pd.getNode("b"), secondToken.getNode() );  
  62.   }  
  63. }  


流程定义文件:

xml 代码
  1. <process-definition>  
  2.     <start-state name='start'>  
  3.         <transition to='and' />  
  4.     <!---->start-state>  
  5.     <fork name='and'>  
  6.         <transition name='first' to='a' />  
  7.         <transition name='second' to='b' />  
  8.     <!---->fork>  
  9.     <state name='a' />  
  10.     <state name='b' />  
  11. <!---->process-definition>"  

         节点流程      start --> and -->  a
                                                     -- >  b

        本例中and --a   , and --> b  一定回被执行. 所以判断如下
         Token firstToken = root.getChild( "first" );
          assertNotNull( firstToken );

        并行分支 (AND-Split ) 多以 同步聚合((Synchronization)  结束.

同步聚合(Synchronization)

Description  : A point in the workow process where multiple parallel subprocesses/activities converge into one single thread of control, thus synchronizing multiple threads. It is an assumption of this pattern that each incoming branch of a synchronizer is executed only once

描述:            一个汇聚点, 多路工作流成执行线程汇聚成单个工作流执行线程. 只有汇聚线程都执行完毕,改汇聚点聚合后的单一线程才会执行.       

同义词:      AND-join, rendezvous, synchronizer.


java 代码
 
  1. /* 
  2.  * JBoss, Home of Professional Open Source 
  3.  * Copyright 2005, JBoss Inc., and individual contributors as indicated 
  4.  * by the @authors tag. See the copyright.txt in the distribution for a 
  5.  * full listing of individual contributors. 
  6.  * 
  7.  * This is free software; you can redistribute it and/or modify it 
  8.  * under the terms of the GNU Lesser General Public License as 
  9.  * published by the Free Software Foundation; either version 2.1 of 
  10.  * the License, or (at your option) any later version. 
  11.  * 
  12.  * This software is distributed in the hope that it will be useful, 
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
  15.  * Lesser General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public 
  18.  * License along with this software; if not, write to the Free 
  19.  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 
  20.  * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 
  21.  */  
  22. package org.jbpm.jpdl.patterns;  
  23.   
  24. import junit.framework.*;  
  25.   
  26. import org.jbpm.graph.def.*;  
  27. import org.jbpm.graph.exe.*;  
  28.   
  29. /** 
  30.  * http://is.tm.tue.nl/research/patterns/download/swf/pat_3.swf 
  31.  */  
  32. public class Wfp03SynchronizationTest extends TestCase {  
  33.   
  34.   public ProcessDefinition createSynchronizationProcessDefinition() {  
  35.     ProcessDefinition pd = ProcessDefinition.parseXmlString(  
  36.       " <process-definition>"</process-definition>  +  
  37.       "   +  
  38.       "     +  
  39.       "  " +  
  40.       "   +  
  41.       "     +  
  42.       "     +  
  43.       "  " +  
  44.       "   +  
  45.       "     +  
  46.       "  " +  
  47.       "   +  
  48.       "     +  
  49.       "  " +  
  50.       "   +  
  51.       "     +  
  52.       "  " +  
  53.       "   +  
  54.       ""  
  55.     );  
  56.     return pd;  
  57.   }  
  58.   
  59.   public void testSynchronizationFirstTokenFirst() {  
  60.     ProcessDefinition pd = createSynchronizationProcessDefinition();  
  61.             
  62.     ProcessInstance pi = new ProcessInstance( pd );  
  63.     pi.signal();  
  64.     Token root = pi.getRootToken();  
  65.     Token firstToken = root.getChild( "first" );  
  66.     Token secondToken = root.getChild( "second" );  
  67.   
  68.     // check that the two tokens are in the states one and two respectively  
  69.     assertSame( pd.getNode("fork"), root.getNode() );  
  70.     assertSame( pd.getNode("one"), firstToken.getNode() );  
  71.     assertSame( pd.getNode("two"), secondToken.getNode() );  
  72.   
  73.     firstToken.signal();  
  74.     assertSame( pd.getNode("fork"), root.getNode() );  
  75.     assertSame( pd.getNode("join"), firstToken.getNode() );  
  76.     assertSame( pd.getNode("two"), secondToken.getNode() );  
  77.       
  78.     secondToken.signal();  
  79.     assertSame( pd.getNode("end"), root.getNode() );  
  80.     assertSame( pd.getNode("join"), firstToken.getNode() );  
  81.     assertSame( pd.getNode("join"), secondToken.getNode() );  
  82.   }  
  83.   
  84.   /** 
  85.    * variation of the pattern where the second token fires first. 
  86.    */  
  87.   public void testSynchronizationSecondTokenFirst() {  
  88.     ProcessDefinition pd = createSynchronizationProcessDefinition();  
  89.             
  90.     ProcessInstance pi = new ProcessInstance( pd );  
  91.     pi.signal();  
  92.     Token root = pi.getRootToken();  
  93.     Token firstToken = root.getChild( "first" );  
  94.     Token secondToken = root.getChild( "second" );  
  95.   
  96.     // check that the two tokens are in the states one and two respectively  
  97.     assertSame( pd.getNode("fork"), root.getNode() );  
  98.     assertSame( pd.getNode("one"), firstToken.getNode() );  
  99.     assertSame( pd.getNode("two"), secondToken.getNode() );  
  100.   
  101.     secondToken.signal();  
  102.     assertSame( pd.getNode("fork"), root.getNode() );  
  103.     assertSame( pd.getNode("one"), firstToken.getNode() );  
  104.     assertSame( pd.getNode("join"), secondToken.getNode() );  
  105.       
  106.     firstToken.signal();  
  107.     assertSame( pd.getNode("end"), root.getNode() );  
  108.     assertSame( pd.getNode("join"), firstToken.getNode() );  
  109.     assertSame( pd.getNode("join"), secondToken.getNode() );  
  110.   }  
  111.   
  112.   /** 
  113.    * nested form of the synchronization pattern. 
  114.    */  
  115.   public ProcessDefinition createNestedSynchronizationProcessDefinition() {  
  116.     // tip : draw this visually if you want to understand it.  
  117.     ProcessDefinition pd = new ProcessDefinition(  
  118.       new String[]{"start-state start",  
  119.                    "fork fork",  
  120.                    "fork fork1",  
  121.                    "fork fork2",  
  122.                    "state state1.1",  
  123.                    "state state1.2",  
  124.                    "state state2.1",  
  125.                    "state state2.2",  
  126.                    "join join2",  
  127.                    "join join1",  
  128.                    "join join",  
  129.                    "end-state end"},   
  130.       new String[]{"start --> fork",  
  131.                    "fork --first--> fork1",  
  132.                    "fork --second--> fork2",  
  133.                    "fork1 --first--> state1.1",  
  134.                    "fork1 --second--> state1.2",  
  135.                    "fork2 --first--> state2.1",  
  136.                    "fork2 --second--> state2.2",  
  137.                    "state1.1 --> join1",  
  138.                    "state1.2 --> join1",  
  139.                    "state2.1 --> join2",  
  140.                    "state2.2 --> join2",  
  141.                    "join1 --> join",  
  142.                    "join2 --> join",  
  143.                    "join --> end"});  
  144.     return pd;  
  145.   }  
  146.   
  147.   public void testSynchronizationNested() {  
  148.     ProcessDefinition pd = createNestedSynchronizationProcessDefinition();  
  149.     ProcessInstance pi = new ProcessInstance( pd );  
  150.     pi.signal();  
  151.     Token rootToken = pi.getRootToken();  
  152.     Token token1 = rootToken.getChild( "first" );  
  153.     Token token2 = rootToken.getChild( "second" );  
  154.     Token token11 = token1.getChild( "first" );  
  155.     Token token12 = token1.getChild( "second" );  
  156.     Token token21 = token2.getChild( "first" );  
  157.     Token token22 = token2.getChild( "second" );  
  158.       
  159.     assertSame( pd.getNode("fork"), rootToken.getNode() );  
  160.     assertSame( pd.getNode("fork1"), token1.getNode() );  
  161.     assertSame( pd.getNode("fork2"), token2.getNode() );  
  162.     assertSame( pd.getNode("state1.1"), token11.getNode() );  
  163.     assertSame( pd.getNode("state1.2"), token12.getNode() );  
  164.     assertSame( pd.getNode("state2.1"), token21.getNode() );  
  165.     assertSame( pd.getNode("state2.2"), token22.getNode() );  
  166.       
  167.     token11.signal();  
  168.   
  169.     assertSame( pd.getNode("fork"), rootToken.getNode() );  
  170.     assertSame( pd.getNode("fork1"), token1.getNode() );  
  171.     assertSame( pd.getNode("fork2"), token2.getNode() );  
  172.     assertSame( pd.getNode("join1"), token11.getNode() );  
  173.     assertSame( pd.getNode("state1.2"), token12.getNode() );  
  174.     assertSame( pd.getNode("state2.1"), token21.getNode() );  
  175.     assertSame( pd.getNode("state2.2"), token22.getNode() );  
  176.   
  177.     token12.signal();  
  178.   
  179.     assertSame( pd.getNode("fork"), rootToken.getNode() );  
  180.     assertSame( pd.getNode("join"), token1.getNode() );  
  181.     assertSame( pd.getNode("fork2"), token2.getNode() );  
  182.     assertSame( pd.getNode("join1"), token11.getNode() );  
  183.     assertSame( pd.getNode("join1"), token12.getNode() );  
  184.     assertSame( pd.getNode("state2.1"), token21.getNode() );  
  185.     assertSame( pd.getNode("state2.2"), token22.getNode() );  
  186.   
  187.     token21.signal();  
  188.   
  189.     assertSame( pd.getNode("fork"), rootToken.getNode() );  
  190.     assertSame( pd.getNode("join"), token1.getNode() );  
  191.     assertSame( pd.getNode("fork2"), token2.getNode() );  
  192.     assertSame( pd.getNode("join1"), token11.getNode() );  
  193.     assertSame( pd.getNode("join1"), token12.getNode() );  
  194.     assertSame( pd.getNode("join2"), token21.getNode() );  
  195.     assertSame( pd.getNode("state2.2"), token22.getNode() );  
  196.   
  197.     token22.signal();  
  198.   
  199.     assertSame( pd.getNode("end"), rootToken.getNode() );  
  200.     assertSame( pd.getNode("join"), token1.getNode() );  
  201.     assertSame( pd.getNode("join"), token2.getNode() );  
  202.     assertSame( pd.getNode("join1"), token11.getNode() );  
  203.     assertSame( pd.getNode("join1"), token12.getNode() );  
  204.     assertSame( pd.getNode("join2"), token21.getNode() );  
  205.     assertSame( pd.getNode("join2"), token22.getNode() );  
  206.   }  
  207. }  
分享到:
评论

相关推荐

    一个JBPM工作流例子,JBPM

    **JBPM工作流详解** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了一整套解决方案,用于设计、执行和管理业务流程。在本示例中,我们将深入探讨如何利用JBPM实现销售批复这一具体...

    jbpm工作流简单实例

    **jbpm工作流简介** jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了一整套解决方案,用于设计、执行和管理业务流程。jbpm不仅支持BPMN(Business Process Model and Notation)...

    jbpm工作流引擎介绍

    【jbpm工作流引擎介绍】 工作流引擎是用于自动化业务流程的软件系统,它通过预定义的流程模版,管理并执行诸如请假、报销、审批等业务操作。工作流引擎的核心功能包括流程定义、执行、管理和监控。在业界,工作流...

    企业OA 完整的jbpm工作流实例

    在这个名为"企业OA 完整的jbpm工作流实例"的项目中,开发者使用了Java SSH框架来构建了一个集成jbpm的工作流系统,特别适合初学者了解和学习工作流的实现。 SSH框架是Struts、Spring、Hibernate三个开源项目的首...

    jBPM4工作流应用开发指南

    ### jBPM4工作流应用开发指南:深入解析工作流技术与企业现代化管理 #### 工作流概览 工作流技术,作为一种先进的自动化手段,旨在优化和加速业务流程的执行,通过计算机辅助或自动化的手段,确保业务过程在正确的...

    jbpm工作流引擎介绍.ppt

    【jbpm工作流引擎介绍】 工作流引擎是用于自动化业务流程的软件,它负责定义、执行和管理这些流程。在企业环境中,常见的业务流程包括请假、报销、公文审批等。工作流引擎通过内置的人工任务功能,确保在流程自动化...

    struts+hibernate+spring+jbpm智能工作流系统

    jBPM 是一个开源的工作流和业务流程管理系统,它支持BPMN2标准,可以创建、执行和监控复杂的业务流程。在智能工作流系统中,jBPM 负责流程的设计、执行和管理。开发者可以通过jBPM 设计流程图,定义任务、事件和决策...

    工作流JBPM开发计划书

    - **完成对JBPM工作流引擎的深入了解**,掌握其核心技术和应用方法。 - **实现一系列定制化的功能模块**,满足特定业务场景的需求。 - **构建一套完整的办公自动化系统**,有效提升工作效率和服务水平。 - **积累...

    jBPM4.4工作流开发指南.docx

    jBPM4.4是一种流行的工作流引擎,它提供了一个强大且灵活的工作流管理系统。本指南将详细介绍jBPM4.4的安装、部署、使用、开发和原理等方面的知识点。 一、开发环境搭建 要开发jBPM4.4工作流,需要安装以下软件: ...

    JBPM综合实例 OA工作流系统源码

    在本实例中,我们将深入探讨如何使用JBPM构建一个OA(Office Automation)工作流系统,同时结合SSH(Spring、Struts和Hibernate)框架进行整合,以实现高效、灵活的业务流程管理。 首先,我们需要理解JBPM的核心...

    Jbpm工作流与ssh框架集成文档

    将Jbpm工作流与SSH框架集成,可以实现业务逻辑和数据持久化的高效协同,为复杂的企业应用提供流畅的流程控制。 集成Jbpm工作流和SSH框架的过程主要包括以下几个步骤: 1. **环境准备**:首先,确保已下载并安装了...

    一种基于SOA和JBPM的工作流引擎模型.pdf

    流程调度控制是工作流引擎的核心,JBPM中的运行标记(token)代表流程实例的一次执行,维护着流程设计的结构。流程实例的每个步骤都由工作流引擎根据流程定义自动控制,确保流程按照预定规则顺畅运行。 此外,任务...

    jbpm_工作流架构.pdf

    配置文件是JBPM工作流框架的重要组成部分,它定义了JBPM的运行环境,并决定了如何与数据库交互以及其他系统服务的集成方式。 - **配置文件的重要性**:配置文件对于JBPM而言至关重要,它是工作流组件的一个主要入口...

    jbpm4.4+s2sh请假流程例子

    【jbpm4.4+s2sh请假流程例子】是一个典型的结合了jbpm4.4工作流引擎和Struts2、Spring、Hibernate(S2SH)框架的实战项目,旨在演示如何在企业级应用中实现一个完整的请假流程。在这个例子中,jbpm4.4作为流程管理的...

    struts+hibernte+spring+jbpm 智能工作流系统

    这个工作流可能涵盖了文章的提交、审核、审批和发布等一系列步骤,通过jBPM定义和控制这些步骤的顺序和条件。同时,Struts处理用户请求,Spring负责组件管理,Hibernate管理数据持久化,整个系统协同工作,实现智能...

    jbpm-designer工作流

    jbpm-designer是一款基于J2EE的轻量级工作流管理系统,它专为设计和管理业务流程而构建。jbpm-designer提供了一种图形化的用户界面,使得非技术人员也能轻松地设计复杂的业务流程,从而降低了流程管理的门槛。在本文...

    jbpm工作流管理系统

    ### JBPM工作流管理系统知识点详解 #### 一、基本流程概念与实例执行概念 JBPM(JBoss Business Process Management)是Red Hat旗下的一款开源工作流引擎,它支持BPMN 2.0标准,用于自动化业务流程。JBPM提供了...

Global site tag (gtag.js) - Google Analytics