Activiti 接收任务活动

  流程中往往需要特定人接受任务并进行一定操作才能继续进行下去。

  代码如下

import java.io.InputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
    public class ReceiveTaskTest {

        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        /**部署流程定义(从inputStream)*/
        @Test
        public void deploymentProcessDefinition_inputStream(){
            InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn");
            InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png");
            Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
                            .createDeployment()//创建一个部署对象
                            .name("接收活动任务")//添加部署的名称
                            .addInputStream("receiveTask.bpmn", inputStreamBpmn)//
                            .addInputStream("receiveTask.png", inputStreamPng)//
                            .deploy();//完成部署
            System.out.println("部署ID:"+deployment.getId());//
            System.out.println("部署名称:"+deployment.getName());//
        }

        /**启动流程实例+设置流程变量+获取流程变量+向后执行一步*/
        @Test
        public void startProcessInstance(){
            //流程定义的key
            String processDefinitionKey = "receiveTask";
            ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
                            .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
            System.out.println("流程实例ID:"+pi.getId());//流程实例ID    101
            System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   helloworld:1:4

            /**查询执行对象ID*/
            Execution execution1 = processEngine.getRuntimeService()//
                            .createExecutionQuery()//创建执行对象查询
                            .processInstanceId(pi.getId())//使用流程实例ID查询
                            .activityId("receivetask1")//当前活动的id,对应receiveTask.bpmn文件中的活动节点id的属性值
                            .singleResult();

            /**使用流程变量设置当日销售额**/
            processEngine.getRuntimeService().setVariable(execution1.getId(), "汇总当日销售额", 21000);

            /**向后执行一步,如果流程处于等待状态,使得流程继续执行*/
            processEngine.getRuntimeService()
                            .signal(execution1.getId());
            /**查询执行对象ID*/
            Execution execution2 = processEngine.getRuntimeService()//
                            .createExecutionQuery()//创建执行对象查询
                            .processInstanceId(pi.getId())//使用流程实例ID查询
                            .activityId("receivetask2")//当前活动的id,对应receiveTask.bpmn文件中的活动节点id的属性值
                            .singleResult();
            /**从流程变量中获取汇总当日销售额的值*/
            Integer value = (Integer)processEngine.getRuntimeService()//
                            .getVariable(execution2.getId(), "汇总当日销售额");
            System.out.println("给老板发送短信:金额是:"+value);
            /**向后执行一步,如果流程处于等待状态,使得流程继续执行*/
            processEngine.getRuntimeService()
                            .signal(execution2.getId());
        }
    }

  由于没有任务id,因此只能由流程进行操作,所以使用getRuntimeService()方法。先由流程实例编号查询流程1,并进行汇总销售操作然后进行到下一个流程。同样,由流程实例编号查询流程2,汇报给老板并进行到下一步完成整个流程

  bpnm文件如下

  

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="receiveTask" name="receiveTaskProcess" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <receiveTask id="receivetask1" name="汇总当日销售额"></receiveTask>
    <receiveTask id="receivetask2" name="给老板发送信息"></receiveTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" sourceRef="receivetask2" targetRef="endevent1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="startevent1" targetRef="receivetask1"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="receivetask1" targetRef="receivetask2"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_receiveTask">
    <bpmndi:BPMNPlane bpmnElement="receiveTask" id="BPMNPlane_receiveTask">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="360.0" y="20.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="receivetask1" id="BPMNShape_receivetask1">
        <omgdc:Bounds height="55.0" width="105.0" x="325.0" y="120.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="receivetask2" id="BPMNShape_receivetask2">
        <omgdc:Bounds height="55.0" width="105.0" x="325.0" y="250.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="360.0" y="360.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="377.0" y="305.0"></omgdi:waypoint>
        <omgdi:waypoint x="377.0" y="360.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="377.0" y="55.0"></omgdi:waypoint>
        <omgdi:waypoint x="377.0" y="120.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="377.0" y="175.0"></omgdi:waypoint>
        <omgdi:waypoint x="377.0" y="250.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>
时间: 2024-08-01 10:41:12

Activiti 接收任务活动的相关文章

软件工程:传统软件工程 vs 敏捷软件开发

前言 软件工程(Software Engineering): 是一种层次化技术. 将系统化的.规范的.可量化的方法应用于软件的开发.运行和维护,即将工程化的方法应用于软件. 研究"建立和使用一套合理的工作原则,以便经济地获得可靠的.可以在实际机器上高效运行的软件"的方法. 敏捷软件开发(Agile software development): 一种应对快速变化的需求的一种软件开发方法.基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作. 一.传统软件工程 (一)产生背景 随着

软件工程--常用软件开发模型比较分析

正如任何事物一样,软件也有其孕育.诞生.成长.成熟和衰亡的生存过程,一般称其为"软件生命周期".软件生命周期一般分为6个阶段,即制定计划.需求分析.设计.编码.测试.运行和维护.软件开发的各个阶段之间的关系不可能是顺序且线性的,而应该是带有反馈的迭代过程.在软件工程中,这个复杂的过程用软件开发模型来描述和表示. 软件开发模型是跨越整个软件生存周期的系统开发.运行和维护所实施的全部工作和任务的结构框架,它给出了软件开发活动各阶段之间的关系.目前,常见的软件开发模型大致可分为如下3种类型.

window窗口详解

窗口 在图形化的基于win32的应用程序,窗口是屏幕的矩形区域,应用程序显示输出并接收来自用户的输入,因此,一个图形化基于win32的应用程序的首要任务之一就是创建一个窗口. 窗口与其它窗口共享屏幕,[本事]包括来自其它应用程序的窗口,每次只有一个窗口可以接收来自用户的输入,用户可以使用鼠标.键盘或其它输入设备与此窗口以及拥有该窗口的应用程序进行交互. 关于窗口 这个概述描述了应用程序用来创建和使用窗口的编程单元:管理窗口之间的关系:以及大小.移动.和显示窗口:概述包括以下主题: 桌面窗口  

软件生存周期模型

软件生存周期模型是描述软件开发过程中各种活动如何执行的模型.软件生存周期模型确立了软件开发和演绎中各阶段的次序限制以及各阶段或机动的准则,确立开 发过程所遵守的规定和限制,便于各种活动的协调,便于各种人员的有效通信,有利于活动重用,有利于活动管理.常见的软件生存周期模型有瀑布模型.演化模型.螺旋模型.喷泉模型等. 1)瀑布模型(waterfall model) 瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协作,即采用结构化的分析与设计方法将逻辑实现与物理实现分开.将软件生

软件工程:理论、方法与实践 软件过程读后感

在软件过程里面,从前言里面我们知道绝大多数软件企业长期面临许多质量,进度,成本的问题,所以产生了人物思维与过程思维两种方式,现在我们对其有了一个定义:软件过程为一个为建造高质量软件所需完成的任务的框架,即形成软件产品的一系列步骤,包括中间产品.资源.角色及过程中采取的方法.工具等范畴.它的基本活动是:问题提出,软件需求规格说明,软件设计,软件实现,软件确认与软件演化等活动. 第二节里我们学习了软件过程模型,其主要如下所示: 1.瀑布模型是最早出现的软件开发模型,在软件工程中占有重要的地位,它提供

3.关于瀑布模型

上周公司给新人上编程规范培训,期间三楼一哥问我瀑布模型主要步骤是什么.花擦,当时我很想问他瀑布模型是什么-.-,作为一个成年人我当然是忍住了,然后启动自己所有的扯淡能力,惶顾左右千回百转之时,平静的告诉他:就是一条道走到底嘛.呵呵,当场为自己的机智折服,正当陶醉在这应答如流壮举中时,老板说,你完全不知道是吧,不是计算机专业的吗?哈哈哈哈哈哈哈,说笑啦....没错,我真不是计算机专业的== 软件开发模型从某种程度上来说是一种方法论,它指的是软件开发全部过程.活动和任务的结构框架.个人觉得要注意几个

【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)

Lab 1: 应用程序建模 实验目标 这个实验的目的是展示如何在Visual Studio 2010旗舰版中进行应用程序建模.团队中的架构师会通过建模确定应用程序是否满足客户的需求. 你可以创建不同级别的详细模型,并将它们彼此结合.测试然后发布到你的开发计划里. 在这个实验中, 我们将重点放在如何创建一系列简单的系统建模图形上. 每个练习应该在 30分钟内完成. Exercise 1 – 理解用户需求 绘制活动.类以及其他UML图形能帮助架构师清晰辨别客户的习惯.业务规则以及其他需求,从而使设计

Android学习之Activity之间的数据传递

Activity与Activity之间很多情况下都需要进行数据的传递,下面就用几个简单的例子来看一下. (一).一个Activity启动另一个Activity并将数据传递到这个Activity当中 思路:1.通过Intent进行数据的传递,Intent作为数据的载体.2.首先将要传递的数据放入到Intent当中.这里用到了Intent中的putExtra()方法,这个方法有一系列的重载.3.启动另一个Activity后将数据从Intent中取出来.这里用到了getStringExtra()方法,

基于Jenkins的自动构建系统开发_android总结

持续集成相关理论 1.1 极限编程的概述 1.1.1 极限编程的产生 2001年,为了解决许多公司的软件团队陷入不断增长的过程泥潭,一批业界专家一起概括出了一些可以让软件开发团队具有快速工作.响应变化能力的价值观和原则,他们称自己为敏捷联盟.敏捷开发过程的方法很多,主要有:SCRUM,Crystal,特征驱动软件开发(Feature Driven Development,简称FDD),自适应软件开发(Adaptive Software Development,简称ASD),以及最重要的极限编程(