`
bevan58
  • 浏览: 36916 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JBPM实践之:并发子流程的实现

    博客分类:
  • JBPM
阅读更多

【转载】:http://www.blogjava.net/ycyk168/archive/2008/11/12/240096.html

关于JBPM中并发子流程的实现方式,网上有很多的说法,但是好像每种办法都有这样那样的缺点,要么实现太复杂,要么就是会使Token无法继续流转。这里我介绍一种我的并发子流程的实现方式:使用TaskNode使任务并行的方式,模拟实现JBPM子流程的并发执行。
 我先简单的介绍一下实现思路:
         1、数据库中应该有至少三个已经发布过的流程定义(ProcessDefinition),发布的顺序无所谓,一个主流程两个子流程
         2、我们在主流程中要实现并发子流程的环节放置TaskNode,设置create-tasks="false"、signal="last-wait"
         3、我们想要实现几个子流程的并发就在第二步放置的TaskNode中放置几个Task,每个Task的名字都是要并发的子流程的名称
         4、在TaskNode的Node-Enter action中,我们手动为每一个Task创建一个任务实例,同时我们取得Task的名字也就是要并发的子流程的名字,创建流程实例
         5、为每个新创建的流程实例设置流程变量:TaskInstanceID表示创建当前子流程的那个主流程任务实例ID,并使子流程开始流转
         6、子流程结束,取得流程变量TaskInstanceID,该流程变量TaskInstanceID是创建他的那个主流程的任务实例,得到该TaskInstance,并TaskInstance.end();
         这个时候因为我们设置了TaskNode的Signal为"last-wait",所以当所有的子流程均结束的时候,主流程才会继续,这样我们也就实现了子流程的并发效果。很简单的一个思路实现起来也并不复杂.

 

首先让我们看一下主流程的流程定义:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition  xmlns=""  name="super1">
    <start-state name="start-state1">
        <transition to="task-node1"></transition>
    </start-state>

    <task-node name="task-node1" create-tasks="false" signal="last-wait">
        <description>
            我们要利用这个TaskNode实现并发子流程,create-tasks="true"是为了可以手动控制任务实例的创建,同时创建子流程,
            signal="last-wait"是为了实现当所有子流程均已完成,主流程才能继续运行的效果
        </description>
        <task name="sub1">
            <description>要并发的子流程之一</description>
        </task>
        <task name="sub2">
            <description>要并发的子流程之二</description>
        </task>
        <event type="node-enter">
            <action name="NodeEnterAction" class="jbpmTest.bfzlc.action.NodeEnterAction"></action>
        </event>
        <transition to="end-state1"></transition>
    </task-node>

    <end-state name="end-state1"></end-state>

    <event type="process-start">
        <script name="SuperProcessStart">
            System.out.println(&quot;主流程启动,并设置主流程ID&quot;);
        </script>
    </event>
    <event type="process-end">
        <script name="SuperProcessEnd">
            System.out.println(&quot;主流程结束&quot;);
        </script>
    </event>
</process-definition>

 

下面是主流程的Node-EnterAction的代码:
public class NodeEnterAction implements ActionHandler {

    public void execute(ExecutionContext executionContext) throws Exception {
        //取得本节点所有的Task
        Set<Task> tasks = ((TaskNode)executionContext.getNode()).getTasks();
        
        TaskMgmtInstance tgmt = executionContext.getTaskMgmtInstance();
        
        for (Task task : tasks) {
            //为每一个Task创建实例
            TaskInstance taskInstance = tgmt.createTaskInstance(task, executionContext);
            //业务Service
            JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade"));
            //根据Task的名字,为每一个Task创建相应的子流程
            ProcessInstance processInstance = jbpmTestFacade.createProcessInstance(task.getName());
            //设置创建这个子流程的流程实例ID
            processInstance.getContextInstance().setVariable("TaskInstanceID", taskInstance.getId());
            //子流程开始流转
            processInstance.signal();
        }
        
    }
}

 

再看其中一个子流程的定义:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition  xmlns=""  name="sub1">
    <start-state name="start-state1">
        <transition to="Sub1Task"></transition>
    </start-state>

    <task-node name="Sub1Task">
        <task name="SubTask1"></task>
        <transition to="end-state1"></transition>
    </task-node>

    <end-state name="end-state1"></end-state>

    <event type="process-start">
        <script name="ProcessStartScript">
            System.out.println(&quot;-------------------sub1流程启动------------------------------&quot;);
        </script>
    </event>

    <event type="process-end">
        <action name="SubProcessEndAction" class="jbpmTest.bfzlc.action.SubProcessEndAction"></action>
    </event>
</process-definition>

 

下面是该子流程的ProcessEndAction:

public class SubProcessEndAction implements ActionHandler {

    public void execute(ExecutionContext executionContext) throws Exception {
        System.out.println(executionContext.getProcessDefinition().getName()+"结束");
        //得到创建当前子流程的那个TaskInstanceID
        String taskInstanceID = executionContext.getContextInstance().getVariable("TaskInstanceID").toString();
        
        //业务Service
        JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade"));
        //取得创建当前子流程的那个主流程taskInstance
        TaskInstance taskInstance = jbpmTestFacade.geTaskInstance(Long.valueOf(taskInstanceID));
        taskInstance.end();
    }

}

 

分享到:
评论

相关推荐

    JBPM实践之:并发子流程的实现.doc

    在JBPM中,处理并发子流程是实现复杂业务逻辑的重要一环。本文将深入探讨如何使用TaskNode来实现并发子流程的模拟执行。 首先,我们需要在数据库中准备至少三个流程定义,包括一个主流程和两个子流程。发布这些流程...

    jbpm4.4 简单请假流程

    - **并发与事务**:jbpm4.4支持多线程执行,保证流程的并发性和事务一致性。 - **插件体系**:可以通过扩展点自定义工作流服务、任务监听器等,适应各种业务需求。 综上,"jbpm4.4简单请假流程"项目展示了如何...

    jbpm的实现流程图.doc

    流程执行是在jbpm中将流程定义付诸实践的过程。当一个流程实例被启动,jbpm的流程引擎会根据流程定义中的规则来驱动流程的执行。每个活动可以被分配给特定的角色或者用户,或者通过服务任务(Service Task)调用外部...

    【转载 见附件】纵观jBPM:从jBPM3到jBPM5以及Activiti5

    3. **Activiti5** - Activiti5是一个基于jBPM设计理念的流程引擎,可能会介绍它的设计目标、与jBMP的相似之处以及不同之处,例如API设计、社区活跃度和企业支持等。 4. **BPMN 2.0** - BPMN(Business Process ...

    JBPM视频教程 JPDL 流程设计器

    在"JBPM-SWF视频教程"中,你将看到这些概念和实践的结合,SWF(Serialized Workflow)可能是指流程定义的序列化格式,用于在不同环境之间传输和存储流程实例。通过观看这个系列教程,你可以全面掌握使用JBPM进行业务...

    JBPM教学课件PPT

    【JBPM工作流详解】 JBPM,全称Java Business Process Management,是一款开源的工作流程管理系统,主要用于...无论是初学者还是经验丰富的开发者,都可以通过深入学习和实践,发掘JBPM在业务流程管理中的无限潜力。

    JBPM5.4及Eclipse流程插件安装

    1. **流程建模工具**:JBPM5.4引入了图形化的BPMN2.0模型编辑器,支持创建复杂的业务流程图,包括任务、决策、事件和子流程等元素。 2. **工作流引擎**:它是一个高性能的执行引擎,能够处理异步任务、事件触发、...

    JBPM5.3开发指南

    本教程旨在帮助开发者快速掌握JBPM5.3的基本使用方法,包括下载安装、环境搭建以及通过具体实例进行实践。 ##### 1.1 什么是JBPM? JBPM是一个基于Java的业务流程管理系统(Business Process Management System, ...

    jbpm4.4文档+学习资料

    jbpm4.4是JBoss企业级业务流程管理(Business Process Management)平台的一个重要版本,它为开发者提供了全面的工作流和业务流程管理解决方案。本文将深入解析jbpm4.4的相关知识点,帮助那些寻找优质学习资源的朋友...

    JBPM4.0源码以及分析

    - **org.jbpm.process.core**: 这个包包含了流程核心组件,如流程定义、节点、连接件等的实现。 - **org.jbpm.process.instance**: 实例化模块,负责流程实例的创建、执行和管理,与PVM紧密关联。 - **org.jbpm....

    jbpm中文指南(包括3和4的)

    6. **流程实例的生命周期**:jbpm4支持流程实例的并发执行、子流程和并行网关,更加符合现实世界的业务流程。 7. **RESTful API**:jbpm4加强了RESTful服务接口,使远程调用和跨系统集成更为便捷。 8. **事件处理*...

    jbpm5资料

    6. **流程实例和变量**:每个流程实例都有一个唯一的ID,可以包含多个并发运行的任务或子流程。流程实例可以有变量,用于存储执行过程中产生的数据。 7. **监听器和事件**:jBPM允许设置监听器来监听特定的流程事件...

    JBPM开发实战教程

    JBPM支持多种流程定义语言,如BPMN2.0,使得开发者能够轻松地设计、实现和部署复杂的业务流程。 ##### 1.2 应用场景 - **企业级项目管理**:适用于项目跟踪、任务分配等。 - **审批流程**:如请假申请、报销流程等...

    jbpm3基本资料和代码总结

    jbpm3是该系统的第三个主要版本,它提供了一整套工具和API,帮助开发者实现复杂的业务流程自动化。在本总结中,我们将深入探讨jbpm3的核心概念、功能以及如何进行实际开发。 ### 1. jbpm3核心概念 - **工作流引擎*...

    jbpm3中文文档.rar

    jbpm3是一款基于Java的企业级工作流管理系统,它主要用于实现业务流程自动化,提供了一套完整的工作流解决方案。这个“jbpm3中文文档.rar”压缩包包含了一份关于jbpm3的中文指南,对于学习和理解jbpm3的功能、设计...

    jbpm中文文档--英文文档

    jbpm,全称为Java Business Process Management,是一款开源的工作流管理系统,用于实现业务流程自动化和管理。它是Red Hat公司的产品,是基于Java技术的企业级工作流平台,能够帮助开发者设计、执行、管理和优化...

    jbpm4.3 中文文档

    jbpm4.3是JBoss企业级业务流程管理(Business Process Management)平台的一个版本,它提供了全面的工作流和业务流程自动化解决方案。这个中文文档集合旨在帮助中国开发者和IT专业人士更好地理解和使用jbpm4.3的功能...

    JBPM5.4 SSH 完整项目整合案例

    JBPM5.4是JBPM的一个稳定版本,提供了丰富的流程定义语言BPMN2.0支持,可以设计复杂的流程图,并且具有强大的执行引擎,能够处理并发、分支、循环等流程逻辑。此外,JBPM还提供了工作流监控、任务分配、审计日志等...

    jbpm视频

    JBPM的核心目标是帮助企业实现业务流程的灵活管理和优化,以提高效率并降低运营成本。 在JBPM的学习过程中,"jbpm-overview.swf"这个文件可能是一个介绍性的视频教程,用于概述JBPM的基本概念、架构以及如何开始...

    jbpm文档+ppt

    7. **性能优化**:指导如何调整jbpm配置以提升系统性能,处理大量并发流程实例。 8. **维护与升级**:介绍流程变更管理、数据迁移、版本控制等维护策略,确保系统的稳定性和持续性。 通过学习这两个资源,无论是...

Global site tag (gtag.js) - Google Analytics