Business archives (业务归档)

为了部署流程,业务档案必须被封装,业务档案是activiti 引擎部署的单元,它相当于zip文件,它包含BPMN 2.0 processes, task forms, rules 和其它文件,可以说是一些资源文件的集合。

当一个业务归档被部署,它可以扫描扩展名是 .bpmn20.xml或.bpmn

注意: Java classes present in the business archive will not be added to the classpath.

部署方式

String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));

repositoryService.createDeployment()
    .name("process-one.bar")
    .addZipInputStream(inputStream)
    .deploy();
        

Deploying with Activiti Explorer

一个Activiti Explorer web应用允许上传 bar文件和单独的bpmn20.xml文件,选择管理页签点击Deployment

所有自定义的java类都可以在流程中使用

Versioning of process definitions 流程定义的版本控制

对每个流程定义都要完成 属性 key version name id的初始化

  • id  是流程定义的key

  • name 流程定义的名字,并不是必须的
  • 第一次部署有一个特殊的key,分配版本是1.后来的流程定义使用相同的key,版本每次加1,key用来区分流程定义的
  • id属性可以设置为 {processDefinitionKey}:{processDefinitionVersion}:{generated-id}

为流程中加图片资源

repositoryService.createDeployment()  .name("expense-process.bar")  .addClasspathResource("org/activiti/expenseProcess.bpmn20.xml")  .addClasspathResource("org/activiti/expenseProcess.png")  .deploy();

通过api可以再次获取图片资源

  ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()                                                         .processDefinitionKey("expense")                                                         .singleResult();    String diagramResourceName = processDefinition.getDiagramResourceName();  InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);


如果不想生成流程图,isCreateDiagramOnDeploy 属性可以在流程引擎配置中设置

<propertyname="createDiagramOnDeploy"value="false"/>

Category

用户自己定义的目标名称空间,而不是使用默认的时:<definitions ... targetNamespace="yourCategory" ...

应该按照下面方式部署:
repositoryService.createDeployment().category("yourCategory")....deploy();


Defining a process

1, 创建xml文件,扩展名 是 .bpmn20.xml or .bpmn

2, 根元素 definitions. 在它里面可以定义多个process。任何一个空的流程定义像下面那样. definitions 元素至少需要 xmlns 和 targetNamespace 声明.targetNamespace可以是任意的, 对于分类管理流程定义很有用

<definitions
  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
  xmlns:activiti="http://activiti.org/bpmn"
  targetNamespace="Examples">

  <process id="myProcess" name="My First Process">
    ..
  </process>

</definitions>

可选的:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL
                    http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd

3, process 元素有两个属性

     id: id是必须的属性,并且以map的key形式放到ProcessDefinition 对象中,id可以用来启动一个流程实例

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");

name : 可选属性,一般是给用户看的

4, 我们通过流程设计器,定义了如下内容的流程定义文件

<definitions id="definitions"
  targetNamespace="http://activiti.org/bpmn20"
  xmlns:activiti="http://activiti.org/bpmn"
  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">

        <process id="financialReport" name="Monthly financial report reminder process">

          <startEvent id="theStart" />

          <sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportTask' />

          <userTask id="writeReportTask" name="Write monthly financial report" >
            <documentation>
              Write monthly financial report for publication to shareholders.
            </documentation>
            <potentialOwner>
              <resourceAssignmentExpression>
                <formalExpression>accountancy</formalExpression>
              </resourceAssignmentExpression>
            </potentialOwner>
          </userTask>

          <sequenceFlow id='flow2' sourceRef='writeReportTask' targetRef='verifyReportTask' />

          <userTask id="verifyReportTask" name="Verify monthly financial report" >
            <documentation>
              Verify monthly financial report composed by the accountancy department.
              This financial report is going to be sent to all the company shareholders.
            </documentation>
            <potentialOwner>
              <resourceAssignmentExpression>
                <formalExpression>management</formalExpression>
              </resourceAssignmentExpression>
            </potentialOwner>
          </userTask>

          <sequenceFlow id='flow3' sourceRef='verifyReportTask' targetRef='theEnd' />

          <endEvent id="theEnd" />

        </process>

</definitions>

5, 有了流程定义文件之后,我们需要部署这个流程定义文件

Deployment deployment = repositoryService.createDeployment()  .addClasspathResource("FinancialReportProcess.bpmn20.xml")  .deploy();

6, 部署之后,就可以启动一个流程实例了

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport"); //这个key就是流程定义中定义的process  的id

 通过start事件后,流程会沿着start事件的所有输出流执行(该例子中只有一个流),执行到第一个任务(“编制月度财务报表”)。 此时Activiti引擎会向持久化数据库中存储一个任务。此时,关联在该任务上的用户或组的分配得以解析,并且也被存储到数据库中。 值得注意的是Activiti引擎会继续流程的执行步骤直到流程执行进入一种等待状态,比如用户任务。 在这样一种等待状态,流程实例的当前状态被存储到数据库中。流程会保持该状态直到有用户决定完成其任务。那时,流程引擎会继续执行流程直到流程进入一个新的等待状态或流程终点。 其间,如果遇到流程引擎重启或崩溃的情况,流程状态也是安全的保存在数据库中。

  流程的状态 时刻会在数据库中保存的
任务创建后,startProcessInstanceByKey 方法就会返回,因为用户任务的活动处于等待状态。该例子中,任务分配给了一个组,这意味着该组中的每个成员都是任务执行的候选者。

7, 获取任务列表

List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();注意,我们传递给该方法的用户必须是accountancy组的成员,因为这在流程定义中进行了声明。
<potentialOwner>
  <resourceAssignmentExpression>
    <formalExpression>accountancy</formalExpression>
  </resourceAssignmentExpression>
</potentialOwner>
我们也可以利用这个组名使用任务查询的API得到同样的结果。此时我们可以向代码中添加如下逻辑:
TaskService taskService = processEngine.getTaskService();List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();

8, 会计现在需要认领此任务。通过认领任务,将有专人作为该任务的代理人(译注,代理人即为分配到任务的人或责任人),同时该任务会从会计组其他成员的任务列表中消失。程序上完成认领任务如下
taskService.claim(task.getId(),"fozzie");

该任务现在存在于认领该任务的候选者的个人任务列表中
List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();9, 完成任务
taskService.complete(task.getId());

10. 是否完成可以在历史中查看
HistoryService historyService = processEngine.getHistoryService();HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();System.out.println("Process instance end time: "+ historicProcessInstance.getEndTime());

代码综述

public class TenMinuteTutorial{    publicstaticvoid main(String[] args){        // Create Activiti process engine    ProcessEngine processEngine =ProcessEngineConfiguration      .createStandaloneProcessEngineConfiguration()      .buildProcessEngine();        // Get Activiti services    RepositoryService repositoryService = processEngine.getRepositoryService();    RuntimeService runtimeService = processEngine.getRuntimeService();        // Deploy the process definition    repositoryService.createDeployment()      .addClasspathResource("FinancialReportProcess.bpmn20.xml")      .deploy();        // Start a process instance    String procId = runtimeService.startProcessInstanceByKey("financialReport").getId();        // Get the first task    TaskService taskService = processEngine.getTaskService();    List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();    for(Task task : tasks){      System.out.println("Following task is available for accountancy group: "+ task.getName());            // claim it      taskService.claim(task.getId(),"fozzie");    }        // Verify Fozzie can now retrieve the task    tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();    for(Task task : tasks){      System.out.println("Task for fozzie: "+ task.getName());            // Complete the task      taskService.complete(task.getId());    }        System.out.println("Number of tasks for fozzie: "             + taskService.createTaskQuery().taskAssignee("fozzie").count());        // Retrieve and claim the second task    tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();    for(Task task : tasks){      System.out.println("Following task is available for accountancy group: "+ task.getName());      taskService.claim(task.getId(),"kermit");    }        // Completing the second task ends the process    for(Task task : tasks){      taskService.complete(task.getId());    }        // verify that the process is actually finished    HistoryService historyService = processEngine.getHistoryService();    HistoricProcessInstance historicProcessInstance =       historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();    System.out.println("Process instance end time: "+ historicProcessInstance.getEndTime());  }

}

												

Activiti-05-.Deployment and MN 2.0 Introduction的更多相关文章

  1. ZOJ2418 Matrix 2017-04-18 21:05 73人阅读 评论(0) 收藏

    Matrix Time Limit: 2 Seconds      Memory Limit: 65536 KB Given an n*n matrix A, whose entries Ai,j a ...

  2. Activiti工作流学习-----基于5.19.0版本(6)

    七. BPMN的简介 读者了解到这里,应付一般的工作流开发已经足够了.此处应该有华丽的分割线,在工作流项目中核心开发人员主要是对工作流业务设计以及实现,而初级开发人员是对业务功能的代码实现.以后将主要 ...

  3. Activiti工作流学习-----基于5.19.0版本(3)

    前面关于eventType的属性值的配置简单的说了一下,activiti支持的值如下表所示:这是我摘抄的activiti官网的 Event 的名字 描述 Event的类名 ENGINE_CREATED ...

  4. Activiti工作流学习-----基于5.19.0版本(5)

    五.与Spring集成 实际项目中一般都有Spring的身影,与Spring集成使得Activiti的实用性得到提高.activiti和Spring整合需要activiti-spring的jar在类路 ...

  5. Activiti工作流学习-----基于5.19.0版本(4)

    四.使用工作流开发 org.activiti.engine.ProcessEngine提供的Service作用在工作流引擎上面,如果所示是模仿一个公司简单的审批流程,你可以下载这个Demo:Activ ...

  6. Activiti工作流学习-----基于5.19.0版本(8)

    8.1.5 Start Event 继续上一篇的事件的分享笔记,Start Event指明该处是流程开始,至于开始事件的类型(消息到达开始,指定的事件循环开始等),定义如何开始是在开始事件圆圈图标里面 ...

  7. Activiti工作流学习-----基于5.19.0版本(7)

    八.BPMN 2.0流程图详解 BPMN 2.0的标准的出现是好事,用户不在被某个工作流开发商绑架或者在工作流中开发妥协,Activiti作为BPMN标准的一套解决方案,使得用户在选择工作流框架时可以 ...

  8. Activiti工作流学习-----基于5.19.0版本(2)

    二.activiti.cfg.xml的其他bean节点配置 2.1 新特性:Job Executor和Async Executor 从5.17.0版本的activiti开始提供作业执行者(Job Ex ...

  9. 1: 介绍Prism5.0 Introduction to the Prism Library 5.0 for WPF(英汉对照版)

     Prism provides guidance designed to help you more easily design and build rich, flexible, and easy- ...

随机推荐

  1. shell的编程结构体

    本文目录: 1.1 shell函数 1.2 条件结构:if 1.3 条件结构:case 1.4 条件结构:select 1.5 循环结构:for 1.6 循环结构:while 1.7 循环结构:unt ...

  2. Framework7

    完美的HTML框架 可以构建精美的iOS & Android 应用

  3. Linux中的定时任务at、crontab

    at at命令可以用来在某一时段执行一次任务,只会执行一次,不会重复执行. at命令是由atd服务来控制的,使用之前先查看atd服务是否正常: $ /etc/init.d/atd status * a ...

  4. python基础学习(十二)

    模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...

  5. 我理解的Java中重载与重写

    程序中我们用方法来实现对对象的操作,但是对象可能有不同的数据类型,这时候对不同的数据类型,进行相同的操作,我们就可以用到方法的重载,即方法名相同,但是具有不同的参数列表. 方法的重载可以根据传递参数的 ...

  6. POI处理Excel中的日期数据类型

    在POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理. 正确的处理方法是先判断单元格 的类型是否则NUMERIC类型, 然后再判断单元格是 ...

  7. postgresql如何维护WAL日志/归档日志

    WAL日志介绍 wal全称是write ahead log,是postgresql中的online redo log,是为了保证数据库中数据的一致性和事务的完整性.而在PostgreSQL 7中引入的 ...

  8. 为测试赋能,腾讯WeTest探索手游AI自动化测试之路

    作者:周大军/孙大伟, 腾讯后台开发 高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.  WeTest导读 做好自动化测试从来不件容易的事情,更何况是手游的自动化测试,相比传 ...

  9. Ubuntu Docker Registry 搭建私有仓库

    服务器版本 Ubuntu 16.04 LTS. 安装命令: $ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --rest ...

  10. Git学习总结(一)

    .常用Git命令清单 一.新建代码库 #在当前目录创建一个Git代码库 $ git init #新建一个目录,将其初始化为Git代码库 $ git init [project name] #下载一个项 ...