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
  在CODE上查看代码片 派生到我的代码片
  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.    
  27.       // 方式二:读取zip压缩文件  
  28.       /*ZipInputStream zipInputStream = new ZipInputStream(this.getClass() 
  29.    .getClassLoader().getResourceAsStream("process.zip")); 
  30.       deploymentBuilder.addZipInputStream(zipInputStream); 
  31.       Deployment deployment =deploymentBuilder.deploy();*/  
  32.    }  
  33.    }  

部署流程定义步骤:

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

流程定义查询步骤:

 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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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(02);  
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * 查询任务列表查询act_ru_task表 
  3.   
  4.     */  
  5.    @Test  
  6.    public void queryTask() {  
  7. TaskQuery query= processEngine.getTaskService().createTaskQuery();  
  8.       String assignee = "张三";  
  9.       query.taskAssignee(assignee);  
  10. query.orderByTaskCreateTime().desc();  
  11.       List<Task> list = query.list();  
  12.       for (Task task :list) {  
  13.          System.out.println(task.getId()+ " " + task.getName());  
  14.       }  
  15.    }  
十二、       办理任务

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * 办理任务 
  3.     */  
  4.    @Test  
  5.    public void completeTask(){  
  6.       String taskId= "404";  
  7.       processEngine.getTaskService().complete(taskId);  
  8.    }  
十三、       直接将流程想下执行一步 管理员用户拥有该权限

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * 直接将流程向下执行一步act_ru_task表增加一条数据,直接跳过一步 
  3.     */  
  4.    @Test  
  5.    public void signal(){  
  6.       String executionId = "2701";//流程实例id  
  7.       processEngine.getRuntimeService().signal(executionId);  
  8.    }  
已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其中的开发技巧。<br /> 商城项目所涉及的功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目 </li> <li> 最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目的页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页