`
bevan58
  • 浏览: 36177 次
  • 性别: 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中并发子流程的实现方式,网上有很多的说法,但是好像每种办法都有这样那样的缺点,要么实现太复杂,要么就是会使Token无法继续流转。这里我介绍一种我的并发子流程的实现方式:使用TaskNode使任务并行的...

    JBPM数据库表说明.doc

    1.1 JBPM_PROCESSDEFINITION:流程模版表 2 1.2 JBPM_NODE:流程节点表 2 1.3 JBPM_TRANSITION:流程迁移表 3 1.4 JBPM_ACTION:流程动作表 4 1.5 JBPM_EVENT:流程事件表 5 1.6 JBPM_DELEGATION:流程代理类表...

    JBPM数据库表说明 jbpm 工作流 详细到每一个字段,不要下载分

    1.1 JBPM_PROCESSDEFINITION:流程模版表 2 1.2 JBPM_NODE:流程节点表 2 1.3 JBPM_TRANSITION:流程迁移表 3 1.4 JBPM_ACTION:流程动作表 4 1.5 JBPM_EVENT:流程事件表 5 1.6 JBPM_DELEGATION:流程代理类表...

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

    jbpm流程设计器 + 生成对应xml文档 完美实现

    jbpm流程设计器 + 生成对应xml文档: 内部含有: jbpm控件 1: myflow2:插件原本内容 访问地址:http://localhost:8080/jbpmFlow1/myflow2/demo4.jsp 实现生成对应xml文档 并写有对xml文档读取存储到对象中,...

    jbpm+S2SH请假流程经典实现及源码

    jbpm+S2SH请假流程经典实现及源码

    JBPM流程监控的实现过程

    JBPM流程监控的实现过程

    jbpm各种表单之间的关系

    流程配置类数据库表 JBPM_NODE:流程节点表 JBPM_ TRANSITION:流程迁移表 JBPM_ACTION:流程动作表 JBPM_EVENT:流程事件表

    JBPM采购申请系统——08_JBPM流程节点.7z

    JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...

    jbpm-designer:定制的jbpm流程编辑器

    在BPM平台产品中,对jbpm的流程设计器(2.4.1)做了大量定制。包括: 本地化 界面简化,功能简化 连接平台获取变量、用户、组、子流程等 增加子系统参数 增强变量、用户、组设置 增加审批、会签设置,在任务图标上增加...

    jbpm4.4+s2sh请假流程例子

    jbpm4.4整合s2sh 请假流程例子

    JBPM 流程 监控 的实现

    JBPM是JBOSS公司的一个开源工作流产品,它功能强大,商业工作流所提供的功能它基本上都有。然而在JBPM中没有提供流程监控的功能的相关API,这点让很多使用JBPM做企业应用的开发人员颇为头疼。

    jbpm工作流程

    jbpm工作流程jbpm工作流程jbpm工作流程jbpm工作流程jbpm工作流程

    jbpm4整合流程例子 web流程设计器

    jbpm4整合流程例子及附代web流程设计器可以进行流程设计

    jbpm的实现流程图.doc

    一、流程定义的基本概念: 二、流程执行的基本概念: 三、流程引擎核心调度过程 ----------------------- jbpm的实现流程图全文共3页,当前为第1页。 jbpm的实现流程图全文共3页,当前为第2页。 ࠀ࠘ࠚࠜࣾऀंऄआ...

    jbpm4.4流程图

    jbpm4.4流程图

    JBPM4.4所需要的包.rar

    juel-api.jar ,juel-engine.jar, juel-impl.jar, jbpm.jar ,mail.jar

    应用jBPM4解决中国特色的流程需求

    应用jBPM4解决中国特色的流程需求,中国特色流程解决思路。

    jbpm学习笔记jbpm学习笔记

    jbpm学习笔记:安装插件、配置环境、发布流程定义、查看流程定义

    jbpm3.2表说明

    JBPM_NODE JBPM_NODE FK_PROCST_SBPRCDEF SUBPROCESSDEFINITION_ 子流程的指定在父流程离开之前子流程将完整的执行 JBPM_NODE JBPM_NODE FK_NODE_PROCDEF PROCESSDEFINITION_ 此NODE自身存在的流程ID JBPM_NODE ...

Global site tag (gtag.js) - Google Analytics