工作流从流程定义到创建一个流程实例完成执行步骤
  1. 使用activi-designer创建一个流程定义(.bpmn结尾的文件)
  2. 将定义好的流程定义和生成的png图片通过RepositoryService(前面章节说过主要是用来处理流程定义的service)的api上传到数据库
  3. 通过RuntimeService(这个service主要是处理当前正在运行的流程实例的)启动一个流程实例
  4. 这个时候通过TaskService(主要处理当前运行的任务,一个流程实例下有多个任务)获取到上面的实例所对应的当前人任务
  5. 结束上面的任务task,流程实例会走向下一个task任务
  6. 重复4,5,完成一个流程实例的启动到结束

  上面就是一个最简单从上往下执行的流程的执行步骤,本章节都是以代码做示例,代码不多,但是都执行一遍,你会对整个activiti的流程有个大概的了解

  

  1,首先第一步要做的就是通过eclipse插件activiti-designer绘制一张最简单的流程图出来(在这里我们只用到了startEvent,endEvent,UserTask三个组件所以是比较简单的)

  

  

  绘制的流程图如下

  

  当我们点击创建采购单的时候,为这个节点定义一个id和名称(下面几个节点也是同样的道理)

  


  

  

  点击左侧的mainConfig在Assingee输入一个名字,设置该流程这个步骤的处理人(当然在实际程序中会采用另外的动态获取的方式,这样只是方便理解一个整体过程)

  接下来同样的道理依次为每个节点设置处理人

  


  最后点击空白处,设置整个流程的id和名称

  

  到这里点击保存后,会在相同的目录下生成purchasingflow.png,到这里简单的流程就绘制完成了

  2,利用activiti的api将上面定义好的工作流bpmn文件和png文件上传到activiti的数据库

 /*
* 获取流程引擎对象,下面的方法会默认查找classpath目录下的名称为activi.cfg.xml
* 里面bean的id为processEngineConfiguration的ProcessEngineConfiguration引擎配置对象来获取ProcessEngine对象
*/
private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); //部署一个流程
@Test
public void deployProcessDefinition(){
//根据引擎获取资源service
RepositoryService repositoryService = engine.getRepositoryService();
//部署bpmn文件
String bpmnName="purchasingflow.bpmn";
InputStream bpmnIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.bpmn");
//部署bpmn生成的图片
String pngName="purchasingflow.png";
InputStream pngIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.png");
//添加这两个文件进行部署
Deployment deployment = repositoryService.createDeployment()
.addInputStream(bpmnName, bpmnIn)
.addInputStream(pngName, pngIn)
.deploy(); System.out.println("部署id:"+deployment.getId());
System.out.println("部署的name:"+deployment.getDeploymentTime()); }

  上面的简单的api就将采购流程的流程定义部署到我们的activiti的数据库,打开数据库act_re_procdef可以查询到我们刚才上传的流程定义

  

  3,在启动一个流程实例之前我们再重复上传上面的流程定义,接着我们根据流程定义的id(purchasingflow)来查询这个流程定义看看会发生什么情况 

 //查询流程定义
@Test
public void queryProcessDefinition(){ RepositoryService repositoryService = engine.getRepositoryService();
//创建流程定义查询对象
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); String processDefinitionKey = "purchasingflow";
//设置流程定义的key的查询条件
definitionQuery.processDefinitionKey(processDefinitionKey);
//查询所有的流程定义
List<ProcessDefinition> processDefinitionList = definitionQuery.list();
for(ProcessDefinition definition:processDefinitionList){
System.out.println("-------------------------");
System.out.println("流程定义id:"+definition.getId());
System.out.println("流程资源名:"+definition.getResourceName());
System.out.println("流程部署id:"+definition.getDeploymentId());
} }

  上面的结果输出了三条流程定义,并且部署的id不同和流程定义的id都不相同,带着这个疑问,我们在下面启动一个流程实例并详细讲解下

  

  4,启动一个流程实例

 //启动一个流程实例
@Test
public void startProcessInstance(){ RuntimeService runtimeService = engine.getRuntimeService(); String processDefinitionKey = "purchasingflow";
//根据流程定义的key启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程实例id:"+processInstance.getId());
System.out.println("流程定义id:"+processInstance.getProcessDefinitionId()); }

  我们发现上面打印的流程定义的id是我们最后一次上传的流程定义,所以我们得出结论,多次上传相同id的流程定义,根据流程定义启动流程实例,会取版本最新的流程定义

  

   5,查询当前处理人的任务,我们之前在流程定义的时候写死第一个节点(也就是创建采购单这一步的处理人是zhangsan)

 //查询当前用户的代办任务
@Test
public void queryProcessInstance(){ //查询任务使用的service
TaskService taskService = engine.getTaskService();
//获取任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
taskQuery.taskAssignee("zhangsan");
//查询该条件下的所有的任务
List<Task> tasks =taskQuery.list();
for(Task task:tasks){
System.out.println("当前任务id:"+task.getId());
System.out.println("当前任务所属流程定义id:"+task.getProcessDefinitionId());
System.out.println("当前任务的key:"+task.getTaskDefinitionKey());
} }

  我们通过zhangsan查询到当前任务的id和所属流程定义id,大家会发现如果填写的不是zhangsan而是别的就会查询不到,因为我们指定的任务处理人是zhangsan

  

  6,处理一个任务,到这里我们的zhangsan获取到这个任务后,需要处理完它

 //完成一个流程
@Test
public void completeProcessInstance(){ //任务的id,后期整合后会通过当前登录人身份查询到该用户的任务,然后获取到该id
String taskId="402";
TaskService taskService = engine.getTaskService();
//根据任务id完成该任务
taskService.complete(taskId); }

  

  7,我们在通过lisi,也就是下一节点的处理人查询当前任务会发现查询到了一个任务,然后重复5,6,直到任务结束

  

  

  

  

  

  

  

  

(2)java程序走一遍工作流activiti的更多相关文章

  1. JAVA学习之Java程序开发初次体验

    Java环境搭建算完成了,那么接下来写个Java程序走一个 开发Java程序的简单流程 1.将Java代码编写到扩展名为.java的文件中2.通过javac命令对该Java文件进行编译(生成class ...

  2. To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...

  3. 使用 SecurityManager 和 Policy File 管理 Java 程序的权限

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...

  4. Java 程序员们值得一看的好书推荐

    "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...

  5. 分享下对JAVA程序员成长之路的总结<转>

    我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见.   首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...

  6. 给Java程序猿们推荐一些值得一看的好书

    学习的最好途径就是看书 "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的 ...

  7. Java 程序员们值得一看的好书推荐[转载]

    “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他 ...

  8. Java教程-Java 程序员们值得一看的好书推荐

    学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资 ...

  9. [转] java书籍(给Java程序猿们推荐一些值得一看的好书 + 7本免费的Java电子书和教程 )

    7本免费的Java电子书和教程 1. Thinking in Java (Third Edition) 本书的作者是Bruce Eckel,它一直都是Java最畅销的免费电子书.这本书可以帮助你系统的 ...

随机推荐

  1. Linux磁盘配额实验

    1.实现磁盘限额的条件 *需要Linux内核支持 *安装quota软件包2.Linux磁盘限额的特点 作用范围:针对指定 文件系统(分区) 限制对象:普通用户帐号.组帐号 限制类型:磁盘容量(默认单位 ...

  2. XML&AJAX

    AJAX: Asynchronous Javascript and XML 1. 客户端触发异步操作 2. 创建新的XMLHttpRequest, 是重要的js对象,通过它提起对服务器端的请求 3. ...

  3. 从内存中加载DLL Delphi版(转)

    源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...

  4. iOS 为label添加删除线

    UILabel *testLabel = [[ UILabel alloc] initWithFrame:CGRectMake(, , , )]; testLabel.numberOfLines = ...

  5. ucos任务优先级从64到256,任务就绪表的改变

    Ucos在任务调度中经常使用的技术为任务就绪表,在之前的文章中使用的例子是低于64个优先级的任务就绪表查找方法,现在ucos将任务扩展到256优先级之后,任务就绪表的查找也做了一定的修改,今天来讲讲 ...

  6. js脚本语言(数组)

    定义:给数据Array(1,3.14,"aa")给长度(Array(5))使用方括号定义[1,3.14,"aa"] 属性:lenght(数据的长度) 方法:pu ...

  7. backup-mysql.sh

    #!/bin/bash#auto backup mariadb#xuegod 2015-12-30#Define PATH 定义变量date=`date +%Y-%m-%d`BAKDIR=" ...

  8. 医院his系统数据库恢复

    医院IT系统的重要性堪比金融行业,“银行系统宕机,老百姓不能取钱:医院HIS系统宕机,老百姓不能看病”, 医院信息系统称得上是迄今为止企业级信息系统中最复杂的一类.  某医院HIS系统SQL2008数 ...

  9. jQuery图片轮播的具体实现

    先看一看html代码,以及对应的css代码: <div id="scrollPics">    <ul class="slider" > ...

  10. 负载均衡探测器lbd

    负载均衡探测器lbd   大型网站为了解决海量访问问题,往往采用负载均衡技术,将用户的访问分配到不同的服务器上.网站的负载均衡可以从DNS和HTTP两个环节进行实施.在进行Web渗透测试的时候,需要先 ...