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

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

    博客分类:
  • java
阅读更多
好像源代码功能有点问题.

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jbpm.jpdl.patterns;

import junit.framework.*;

import org.jbpm.graph.def.*;
import org.jbpm.graph.exe.*;

/**
 * http://is.tm.tue.nl/research/patterns/download/swf/pat_5.swf
 *
 * <p>in jbpm every node has an implicit merge in front of it.
 * so it's not necessary to use the merge node.  in fact, i can
 * not think of a situation where implicit merge nodeMap are not
 * sufficient.  for the sake of workflow patterns, we leave if in.
 * jbpm supports merging of both alternative paths of execution
 * and concurrent paths of execution.
 * </p>
 *
 * <p>first the merge node is demonstrated exactly as in the pattern.
 * then the implicit variant is demonstrated, then the merging of
 * concurrent paths is demonstrated.
 * </p>
 */
public class Wfp05SimpleMergeTest extends TestCase {

  private static ProcessDefinition simpleMergeProcessDefinition = createSimpleMergeProcessDefinition();
 
  public static ProcessDefinition createSimpleMergeProcessDefinition() {
    ProcessDefinition pd = new ProcessDefinition(
      new String[]{"start-state start",
                   "state a",
                   "state b",
                   "merge xor",
                   "state c"},
      new String[]{"start --to a--> a",
                   "start --to b--> b",
                   "a --> xor",
                   "b --> xor",
                   "xor --> c"});
    return pd;
  }

  public void testSimpleMergeScenario1() {
    ProcessDefinition pd = simpleMergeProcessDefinition;
    ProcessInstance pi = new ProcessInstance( pd );
    pi.signal("to a");
    Token root = pi.getRootToken();
    assertSame( pd.getNode("a"), root.getNode() );
    root.signal();
    assertSame( pd.getNode("c"), root.getNode() );
  }

  public void testSimpleMergeScenario2() {
    ProcessDefinition pd = simpleMergeProcessDefinition;
    ProcessInstance pi = new ProcessInstance( pd );
    pi.signal("to b");
    Token root = pi.getRootToken();
    assertSame( pd.getNode("b"), root.getNode() );
    root.signal();
    assertSame( pd.getNode("c"), root.getNode() );
  }
 
  private static ProcessDefinition implicitMergeProcessDefinition = createImplicitMergeProcessDefinition();
 
  public static ProcessDefinition createImplicitMergeProcessDefinition() {
    ProcessDefinition pd = new ProcessDefinition(
      new String[]{"start-state start",
                   "state a",
                   "state b",
                   "state c"},
      new String[]{"start --to a--> a",
                   "start --to b--> b",
                   "a --> c",
                   "b --> c"});
    return pd;
  }

  public void testImplicitMergeScenario1() {
    ProcessDefinition pd = implicitMergeProcessDefinition;
    ProcessInstance pi = new ProcessInstance( implicitMergeProcessDefinition );
    pi.signal("to a");
    Token root = pi.getRootToken();
    assertSame( pd.getNode("a"), root.getNode() );
    root.signal();
    assertSame( pd.getNode("c"), root.getNode() );
  }
 
  public void testImplicitMergeScenario2() {
    ProcessDefinition pd = implicitMergeProcessDefinition;
    ProcessInstance pi = new ProcessInstance( implicitMergeProcessDefinition );
    pi.signal("to b");
    Token root = pi.getRootToken();
    assertSame( pd.getNode("b"), root.getNode() );
    root.signal();
    assertSame( pd.getNode("c"), root.getNode() );
  }
 
}

createSimpleMergeProcessDefinition()

创建如下流程定义文件

xml 代码
 
  1. <process-definition name="process">  
  2.     <start-state name='start'>  
  3.         <transition name='to a' to='a' />  
  4.         <transition name='to b' to='b' />  
  5.     </start-state>  
  6.     <state name='a'>  
  7.         <transition to='xor' />  
  8.     </state>  
  9.     <state name='b'>  
  10.         <transition to='xor' />  
  11.     </state>  
  12.     <state name='xor'>  
  13.         <transition to='c' />  
  14.     </state>  
  15.     <state name='c' />  
  16. </process-definition>  


testSimpleMergeScenario1()

节点执行顺序
   
    start --> a --> xor --> c

testSimpleMergeScenario2()
 
    start --> b --> xor --> c

createImplicitMergeProcessDefinition()

创建如下流程定义文件

xml 代码
 
  1. <process-definition name="process">  
  2.     <start-state name='start'>  
  3.         <transition name='to a' to='a' />  
  4.         <transition name='to b' to='b' />  
  5.     </start-state>  
  6.     <state name='a'>  
  7.         <transition to='c' />  
  8.     </state>  
  9.     <state name='b'>  
  10.         <transition to='c' />  
  11.     </state>  
  12.     <state name='c' />  
  13. </process-definition>  


testImplicitMergeScenario1()
节点执行顺序

  start --> a --> c

testImplicitMergeScenario2()
节点执行顺序

  start --> b --> c



以上是对基本控制流程的一些说明, 本人水平有限, 难免有不当之处. 欢迎批评指正.
分享到:
评论
1 楼 jeffen2006 2006-11-30  
好像源代码功能有点问题,是因为merge持久化错误的问题

相关推荐

    jbpm工作流简单实例

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

    jbpm工作流引擎介绍

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

    一个JBPM工作流例子,JBPM

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

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

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

    jBPM4工作流应用开发指南

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

    工作流JBPM开发计划书

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

    jbpm工作流引擎介绍.ppt

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

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

    Struts、Hibernate、Spring 和 jBPM 是四个在企业级应用开发中广泛使用的开源框架,它们结合在一起可以构建出高效且灵活的智能工作流系统。下面将分别介绍这些技术及其在工作流系统中的作用。 **Struts** Struts 是...

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

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

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

    **JBPM综合实例:OA工作流系统源码分析** JBPM(Java Business Process Management)是一个开源的工作流程管理系统,它提供了一套完整的业务流程自动化解决方案,包括流程设计、部署、执行、监控和管理等功能。在本...

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

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

    jbpm_工作流架构.pdf

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

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

    基于SOA和JBPM的工作流引擎模型包含三个主要部分:服务提供者、服务请求者和服务代理。服务提供者是工作流引擎,它将流程定义转换为XML格式的流程实例,并通过Web服务接口发布。服务请求者寻找并绑定所需服务,与...

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

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

    jbpm-designer工作流

    这些库文件确保了jbpm-designer能够正确解析和执行工作流定义,同时也支持与其他系统和服务的集成。 META-INF目录则是Java类加载机制所必需的,其中的MANIFEST.MF文件描述了jar包的元数据,如版本信息、依赖关系等...

    ssh三大框架和jbpm工作流结合

    例如,Spring可以通过AOP来插入工作流的控制,Struts可以处理流程中的用户交互,而Hibernate则负责流程中涉及的数据操作。jbPM的流程定义文件(.bpmn或.bpmn2)可以被Spring管理,流程的启动、审批等操作可以通过...

    jbpm4.4+s2sh请假流程例子

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

Global site tag (gtag.js) - Google Analytics