(2)java程序走一遍工作流activiti
工作流从流程定义到创建一个流程实例完成执行步骤
- 使用activi-designer创建一个流程定义(.bpmn结尾的文件)
- 将定义好的流程定义和生成的png图片通过RepositoryService(前面章节说过主要是用来处理流程定义的service)的api上传到数据库
- 通过RuntimeService(这个service主要是处理当前正在运行的流程实例的)启动一个流程实例
- 这个时候通过TaskService(主要处理当前运行的任务,一个流程实例下有多个任务)获取到上面的实例所对应的当前人任务
- 结束上面的任务task,流程实例会走向下一个task任务
- 重复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的更多相关文章
- JAVA学习之Java程序开发初次体验
Java环境搭建算完成了,那么接下来写个Java程序走一个 开发Java程序的简单流程 1.将Java代码编写到扩展名为.java的文件中2.通过javac命令对该Java文件进行编译(生成class ...
- To Java程序员:切勿用普通for循环遍历LinkedList
ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...
- 使用 SecurityManager 和 Policy File 管理 Java 程序的权限
参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...
- Java 程序员们值得一看的好书推荐
"学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...
- 分享下对JAVA程序员成长之路的总结<转>
我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见. 首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...
- 给Java程序猿们推荐一些值得一看的好书
学习的最好途径就是看书 "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的 ...
- Java 程序员们值得一看的好书推荐[转载]
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他 ...
- Java教程-Java 程序员们值得一看的好书推荐
学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资 ...
- [转] java书籍(给Java程序猿们推荐一些值得一看的好书 + 7本免费的Java电子书和教程 )
7本免费的Java电子书和教程 1. Thinking in Java (Third Edition) 本书的作者是Bruce Eckel,它一直都是Java最畅销的免费电子书.这本书可以帮助你系统的 ...
随机推荐
- SVN参考命令
SVN 命令参考(svn command reference) 用法: svn <subcommand> [options] [args]Subversion 命令行客户端,版本 1.6. ...
- Delphi中unicode转汉字函数(转)
源:Delphi中unicode转汉字函数 近期用到这个函数,无奈没有找到 delphi 自带的,网上找了下 有类似的,没有现成的,我需要的是 支持 “\u4f00 ” 这种格式的,即前面带标准的 “ ...
- 决策树ID3算法的java实现
决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...
- HTML学习(五)链接
1.创建文本链接 <html> <body> <p> <a href="/index.html">本文本</a> 是一个 ...
- (简单) HDU 5154 Harry and Magical Computer,图论。
Description In reward of being yearly outstanding magic student, Harry gets a magical computer. When ...
- vmware克隆Centos6.7虚拟机网卡无法启动问题
快速处理办法: cat /etc/sysconfig/network-scripts/ifcfg-eth0 sed -i '/UUID/d' /etc/sysconfig/network-script ...
- LPC2478的硬件IIC使用
LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...
- tp框架命名空间
命名空间:相当于虚拟的目录在tp里面主要为了实现自动加载类 TP框架下有一个初始命名空间(相当于根目录)初始命名空间:ThinkPHP\Library 在初始命名空间下又包含很多根命名空间这些根命名空 ...
- Cookie 简单使用记录浏览记录
ItemsDAO.java package dao; import java.util.* ; import java.sql.* ; import util.DBHelper; import ent ...
- 微软企业库DBBA的研究
Summary:如何入门使用Data Access Application Block,可以参考Enterprise Library 3.1中文帮助:数据访问应用程序块.这篇文章侧重在DAAB工作原理 ...