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. java 常用命令工具

    1. jmap (1)分析堆信息 jmap -heap java_pid (2) 导出 java进程 5460 的堆内容 到文件 heap.map ,然后使用 jhat 分析 jmap -dump:l ...

  2. windows 资源监视器

    windows的资源监视器有很强大的资源监视能力 win+r输入resmon.exe即可打开

  3. 怎样查看Jdk是32位还是64位

    怎样查看Jdk是32位还是64位.. ------------- --------------- ------------- 其实还可以这样看哦.. --------------- --------- ...

  4. pwnable.kr brainfuck之write up

    I made a simple brain-fuck language emulation program written in C. The [ ] commands are not impleme ...

  5. 学问Chat UI(3)

    前言 上文学问Chat UI(2)分析了消息适配器的实现; 本文主要学习下插件功能如何实现的.并以图片插件功能作为例子详细说明,分析从具体代码入手; 概要 分析策略说明 "+"功能 ...

  6. nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  7. ReactNative环境搭建扩展篇——安装后报错解决方案

    之前一篇写了<逻辑性最强的React Native环境搭建与调试>说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以下简称RN),这一篇重点来说 ...

  8. 在Hudson Job中启动daemon进程

    场景 在Hudson中新建一个Job用于构建Web工程,在Job的构建脚本的最后会启动Jetty,观察发现Jetty启动之后一小段时间,进程就终止了.   环境 CentOS 6,Hudson 3.0 ...

  9. js并行加载,顺序执行

    js并行加载,顺序执行 <script>运行脚本或加载外部文件时,会阻塞页面渲染,阻塞其他资源的加载.如果页面中需要加载多个js文件,在古老浏览器中性能会比较糟糕. 因此有了最原始的优化原 ...

  10. 如何使用EF优雅的配置一对一的关系

    在这两天的时间已经有两位同事问到EF(Code First)如何配置一对一的关系,这个说难也不难,说简单吧,一旦设计跑偏那么在Coding的过程中将会很痛苦. 先举个很简单的例子,两个类User和Pr ...