Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种:

Fatal  error  warn  info  debug  trace

一、部署流程定义

1,在工程项目下创建源码文件夹process

2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram)

3,在test1.bpmn文件定义请假流程或者是报销流程

4,测试代码

[java] view plain copy

  1. public class ActivitiAPI {
  2. //首先获得默认的流程引擎,在创建时会自动加载classpath下得activiti.cfg.xml或者是activiti-context.xml
  3. ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
  4. /**
  5. * 1.部署流程定义
  6. * 会在三张表中产生数据:
  7. * act_ge_bytearray 产生两条数据
  8. *act_re_deployment 产生一条数据
  9. *act_re_procdef 产生一条数据
  10. * 方式一:读取单个的流程定义文件
  11. * 方式二:读取zip压缩文件
  12. */
  13. @Test
  14. public void deploy() {
  15. // 获取仓库服务并创建发布配置对象
  16. DeploymentBuilder deploymentBuilder = processEngine
  17. .getRepositoryService().createDeployment();
  18. // 方式一:设置发布信息
  19. deploymentBuilder.name("请假流程部署");//添加部署规则的名称
  20. // 读取单个的流程定义文件
  21. deploymentBuilder.addClasspathResource("test1.bpmn");
  22. // 添加规则图片  不添加会自动产生一个图片不推荐
  23. deploymentBuilder.addClasspathResource("test1.png");
  24. Deployment
  25. deployment =deploymentBuilder.deploy();
  26. // 方式二:读取zip压缩文件
  27. /*ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
  28. .getClassLoader().getResourceAsStream("process.zip"));
  29. deploymentBuilder.addZipInputStream(zipInputStream);
  30. Deployment deployment =deploymentBuilder.deploy();*/
  31. }
  32. }

部署流程定义步骤:

  1)     首先获得默认的流程引擎getDefaultProcessEngine(),在创建时会自动加载classpath下得activiti-context.xml或者是activiti.cfg.xml

  2)     通过流程引擎获取了一个RepositoryService对象也就是仓库服务对象

  3)     由仓库的服务对象创建一个部署对象配置对象,用来封装部署环境的相关配置。

  4)     这是一个链式编程,在部署配置对象中设置显示名,上传规则文件相对classpath的地址。

  5)     部署,也是往数据库中存储流程定义的过程。

  6)     这一步在数据库中将操作三张表:

    a)     act_re_deployment

     存放流程定义的显示名和部署时间,每部署一次增加一条记录

    b)     act_re_procdef

     存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。

    c)     act_ge_bytearray

     存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。

二、查询流程定义

[java] view plain copy

  1. /**
  2. * 查询流程定义列表
  3. */
  4. @Test
  5. public void queryProcessDefinition(){
  6. // 流程定义查询对象,用于查询表act_re_procdef,添加条件查询
  7. ProcessDefinitionQuery query = processEngine.getRepositoryService()
  8. .createProcessDefinitionQuery();
  9. // 添加过滤条件
  10. query.processDefinitionKey("bxlc");
  11. // 添加排序条件降序排序
  12. query.orderByProcessDefinitionVersion().desc();
  13. // 添加分页查询
  14. query.listPage(0, 10);
  15. List<ProcessDefinition> list =query.list();
  16. for(ProcessDefinition pd : list) {
  17. System.out.println(pd.getName()+ "" + pd.getId());
  18. }
  19. }

流程定义查询步骤:

 1)     因为流程定义的信息存放在仓库中,所以应该获取RepositoryService。

  2)     创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询过滤参数

  3)     调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表

  4)     由运行结果可以看出:

    a)     Key和Name的值为:bpmn文件process节点的id和name的属性值

    b)     key属性被用来区别不同的流程定义。

    c)     带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1

 d)     Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字

    e)     重复部署一次,deploymentId的值以一定的形式变化

三、删除流程定义

[java] view plain copy

  1. /**
  2. * 删除流程定义(通过删除部署信息达到删除流程定义的目的)
  3. *删除act_re_procdef和act_re_deployment表中的一条记录
  4. */
  5. @Test
  6. public void delDeployment() throwsException {
  7. // 获取仓库服务对象
  8. RepositoryService repositoryService =processEngine.getRepositoryService();
  9. // 删除发布信息
  10. String deploymentId = "1";
  11. // 普通删除,如果当前规则下有正在执行的流程,则抛异常
  12. repositoryService.deleteDeployment(deploymentId);
  13. // 级联删除,会删除和当前规则相关的所有信息,包括历史
  14. repositoryService.deleteDeployment(deploymentId, true);
  15. }

四、启动流程实例

什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系),比如:已经定义了一个请假流程,张三同学走了一次该流程这就是启动一次流程实例

[java] view plain copy

  1. /**根据流程定义的id启动一个流程实例,这个流程定义的Id来自act_re_procdef
  2. * 启动一次流程实例act_ru_execution表增加一条数据
  3. */
  4. @Test
  5. public void startProcessInstance() {
  6. //获取流程定义ID
  7. /*
  8. *String processDefinitionId = "qjlc:9:1204"; ProcessInstance
  9. *processInstance =
  10. *processEngine.getRuntimeService().startProcessInstanceById
  11. * (processDefinitionId );System.out.println(processInstance.getId());
  12. */
  13. //自动选择最新版本的流程定义启动流程实例建议使用key来启动
  14. String processDefinitionKey = "qjlc";
  15. ProcessInstance processInstance = processEngine.getRuntimeService()
  16. .startProcessInstanceByKey(processDefinitionKey);
  17. System.out.println(processInstance.getId());
  18. }

五、查询流程实例列表

[java] view plain copy

  1. /**
  2. * 查询流程实例列表,查询act_ru_execution表
  3. */
  4. @Test
  5. public void queryProcessInstance(){
  6. //流程实例查询对象,查询act_ru_execution表
  7. ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
  8. query.processDefinitionKey("qjlc");
  9. query.orderByProcessInstanceId().desc();
  10. query.listPage(0, 2);
  11. List<ProcessInstance> list =query.list();
  12. for(ProcessInstance pi : list) {
  13. System.out.println(pi.getId()+ " " + pi.getActivityId());
  14. }
  15. }

六、结束流程实例

[java] view plain copy

  1. /**
  2. * 结束流程实例,操作的表
  3. * 执行表:act_ru_execution(删除一条数据)
  4. * 任务表 act_ru_task(删除一条数据)
  5. */
  6. @Test
  7. public void deleteProcessInstance(){
  8. String processInstanceId = "1601";
  9. processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "我愿意");
  10. }

七、查询部署信息

[java] view plain copy

  1. /**
  2. * 查询部署列表(同一个流程定义因为修改会进行多次的部署,版本号不一样version会增加,每次部署act_re_deployment表增加一条记录)
  3. */
  4. @Test
  5. public void queryDeployment() {
  6. // 部署查询对象,查询表act_re_deployment
  7. DeploymentQuery query = processEngine.getRepositoryService()
  8. .createDeploymentQuery();
  9. List<Deployment> list =query.list();
  10. for (Deploymentdeployment : list) {
  11. String id = deployment.getId();
  12. System.out.println(id);
  13. }
  14. }

八、删除部署信息

[java] view plain copy

  1. /**
  2. * 删除部署信息,删除act_re_procdef和act_re_deployment表中的一条记录
  3. */
  4. @Test
  5. public void deleteDeployment() {
  6. String deploymentId = "101";
  7. // processEngine.getRepositoryService().deleteDeployment(deploymentId);
  8. //true代表删除级联关联表信息
  9. processEngine.getRepositoryService().deleteDeployment(deploymentId,
  10. true);
  11. }

九、查询一次流程部署对应的文件名称(bpmn,png)和输入流

[java] view plain copy

  1. /**
  2. * 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn,png)
  3. * @throws Exception
  4. */
  5. @Test
  6. public void queryProcessFile() throws Exception {
  7. String deploymentId = "101";
  8. List<String> names = processEngine.getRepositoryService()
  9. .getDeploymentResourceNames(deploymentId);
  10. for (String name :names) {
  11. System.out.println(name);
  12. InputStream in = processEngine.getRepositoryService()
  13. .getResourceAsStream(deploymentId,name);
  14. // 将文件保存到本地磁盘
  15. /*
  16. * OutputStream out = new FileOutputStream(newFile("d:\\" + name));
  17. * byte[] b = new byte[1024]; int len= 0; while((len =
  18. * in.read(b))!=-1) { out.write(b, 0, len);} out.close();
  19. */
  20. //使用org.apache.commons.io.FileUtils的工具类
  21. FileUtils.copyInputStreamToFile(in,new File("d:\\" + name));
  22. in.close();
  23. }
  24. }

十、获取流程定义图标(png文件)

[java] view plain copy

  1. /**
  2. * 获得png文件的输入流
  3. *
  4. * @throws Exception
  5. */
  6. @Test
  7. public void getPng() throws Exception {
  8. String processDefinitionId = "qjlc:9:1204";
  9. InputStream pngInputStream = processEngine.getRepositoryService()
  10. .getProcessDiagram(processDefinitionId);
  11. FileUtils.copyInputStreamToFile(pngInputStream,new File("d:\\my.png"));
  12. }

十一、      查询个人任务列表

[java] view plain copy

  1. /**
  2. * 查询任务列表查询act_ru_task表
  3. */
  4. @Test
  5. public void queryTask() {
  6. TaskQuery query= processEngine.getTaskService().createTaskQuery();
  7. String assignee = "张三";
  8. query.taskAssignee(assignee);
  9. query.orderByTaskCreateTime().desc();
  10. List<Task> list = query.list();
  11. for (Task task :list) {
  12. System.out.println(task.getId()+ " " + task.getName());
  13. }
  14. }

十二、      办理任务

[java] view plain copy

  1. /**
  2. * 办理任务
  3. */
  4. @Test
  5. public void completeTask(){
  6. String taskId= "404";
  7. processEngine.getTaskService().complete(taskId);
  8. }

十三、      直接将流程想下执行一步管理员用户拥有该权限

[java] view plain copy

    1. /**
    2. * 直接将流程向下执行一步act_ru_task表增加一条数据,直接跳过一步
    3. */
    4. @Test
    5. public void signal(){
    6. String executionId = "2701";//流程实例id
    7. processEngine.getRuntimeService().signal(executionId);
    8. }
时间: 2024-10-20 20:22:44

Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作的相关文章

Activiti工作流框架学习(一)——环境的搭建和数据表的了解

一.什么是工作流 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现". 工作流管理系统(Workflow Management System,WfMS)是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行.工作流管理系统不是企业的业务系统,而是为企业

Activiti工作流框架学习(一)之通用数据表详细介绍

文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其他版本则不会.执行自动创建/升级时,引擎将在执行DDL时更改它.使用DDL文件方法时,既可以使用常规版本也可以使用其中带有mysql55的特殊文件(这适用于低于5.6.4的任何版本).后一个文件将具有没有毫秒精度的列类型. 笔者曾经在5.6.0版本做过试验,发现是无法自动生成23张表的,但在5.6.

项目结合activiti工作流框架使用

项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置为1 4.审批中的记录进行审批: 审批通过:工作流任务完成,判断是否最后审批,如果是则更新记录的审批状态. 审批不通过:工作流任务完成,更新记录的审批状态. 原文地址:https://www.cnblogs.com/super-chao/p/8624390.html

Struts2框架学习(二) Action

Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法,返回结果,界面跳转. 拦截器解析请求路径,获取Action的名称,到配置文件中查找action的完整类名,利用反射创建对象. 每请求一次,就创建一个对象,所以action是多例的,也是线程安全的. 2,关系 请求的路径和配置文件的对应关系: 配置文件中包

Android Afinal框架学习(二) FinalActivity 一个IOC框架

框架地址:https://github.com/yangfuhai/afinal 对应的源码: net.tsz.afinal.annotation.view.* FinalActivity FinalActivity是一个基础类,结合注解实现了,依赖注入(view的资源id,常用的监听器), 利用set方式注入 完全注解方式就可以进行UI绑定和事件绑定,无需findViewById和set event Listener 这个过程:initInjectedView>findViewById.set

Java集合框架学习笔记之集合与Collection API

一.CollectionAPI 集合是一系列对象的聚集(Collection).集合在程序设计中是一种重要的数据接口.Java中提供了有关集合的类库称为CollectionAPI. 集合实际上是用一个对象代表一组对象,在集合中的每个对象称为一个元素.在集合中的各个元素的具体类型可以不同,但一般说来,它们都是由相同的类派生出来的(而这一点并不难做到,因为Java中的所有类都是Object的子类).在从集合中检索出各个元素是,常常要根据其具体类型不同而进行相应的强制类型转换. Collection

JBPM学习(二):ProcessEngine与Service API

1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine(); b) 方法二 // 获取单例的ProcessEngine对象,使用的是默认的配置文件(jbpm.cfg.xml) private ProcessEngine processEngine = Configuration

Hibernate框架学习(二)——api详解

一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. 1 //1.创建,调用空参构造(还没有读配置文件) 2 Configuration conf=new Configuration(); 3 //2.读取指令配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件 4 conf.configure(); 5 6 //3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,不需要手动加载 7 //conf.addResource(

Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封装好了许多方法提供我们去使用,使得在使用的时候更加的方便,只需要传递相关参数即可..省去了我们自己使用基础的函数进行构造...   就好比进度框,Toast框,弹出框,确认框...这些基本的东西都在AndBase的AbActivity封装好了...我们只需要传递参数调用其中内部的方法就可以完成这些视