`
bonait
  • 浏览: 3028 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

工作流activiti技术的研究和学习记录第三天

阅读更多

前两天主要是学习activiti(www.zipin168.com)工作流的一些API和基本知识,今天主要是学习activiti中提供几个service服务知识。

一.管理流程定义

流程图如附件。

bpmn文件如下

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="helloworld" name="helloworldProcess" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <endEvent id="endevent1" name="End"></endEvent>
    <userTask id="usertask1" name="提交申请" activiti:assignee="张三"></userTask>
    <userTask id="usertask2" name="审批【部门经理】" activiti:assignee="李四"></userTask>
    <userTask id="usertask3" name="审批【总经理】" activiti:assignee="王五"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_helloworld">
    <bpmndi:BPMNPlane bpmnElement="helloworld" id="BPMNPlane_helloworld">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="330.0" y="20.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="330.0" y="380.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="295.0" y="100.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="295.0" y="200.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
        <omgdc:Bounds height="55.0" width="105.0" x="295.0" y="290.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="347.0" y="55.0"></omgdi:waypoint>
        <omgdi:waypoint x="347.0" y="100.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="347.0" y="155.0"></omgdi:waypoint>
        <omgdi:waypoint x="347.0" y="200.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="347.0" y="255.0"></omgdi:waypoint>
        <omgdi:waypoint x="347.0" y="290.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="347.0" y="345.0"></omgdi:waypoint>
        <omgdi:waypoint x="347.0" y="380.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

说明:流程定义文档有两部分组成:

1)      bpmn文件

流程规则文件。在部署后,每次系统启动时都会被解析,把内容封装成流程定义放入项目缓存中。Activiti框架结合这个xml文件自动管理流程,流程的执行就是按照bpmn文件定义的规则执行的,bpmn文件是给计算机执行用的

2)      展示流程图的图片

在系统里需要展示流程的进展图片,图片是给用户看的

部署流程定义(classpath路径加载文件)

public void deploymentProcessDefinition() {
  Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
    .createDeployment()// 创建一个部署对象
    .name("helloworld入门程序")// 添加部署的名称
    .addClasspathResource("diagrams/helloworld.bpmn")// 从classpath的资源中加载,一次只能加载一个文件
    .addClasspathResource("diagrams/helloworld.png")// 从classpath的资源中加载,一次只能加载一个文件
    .deploy();// 完成部署
  System.out.println("部署ID:" + deployment.getId());// 1
  System.out.println("部署名称:" + deployment.getName());// helloworld入门程序
 }

说明:

1)                                先获取流程引擎对象:在创建时会自动加载classpath下的activiti.cfg.xml

2)                                首先获得默认的流程引擎,通过流程引擎获取了一个RepositoryService对象(仓库对象)

3)                                由仓库的服务对象产生一个部署对象配置对象,用来封装部署操作的相关配置。

4)                                这是一个链式编程,在部署配置对象中设置显示名,上传流程定义规则文件

5)                                向数据库表中存放流程定义的规则信息。

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

a)                        act_re_deployment(部署对象表)

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

b)                        act_re_procdef(流程定义表)

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

注意:当流程定义的key相同的情况下,使用的是版本升级

c)                         act_ge_bytearray(资源文件表)

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

还有另外一种部署方式(文件压缩成zip形式):

public void deploymentProcessDefinition_zip() {
  InputStream in = this.getClass().getClassLoader()
    .getResourceAsStream("diagrams/helloworld.zip");
  ZipInputStream zipInputStream = new ZipInputStream(in);
  Deployment deployment = processEngine.getRepositoryService()
    .createDeployment().name("流程定义")
    .addZipInputStream(zipInputStream).deploy();// 指定zip格式的文件完成部署
  System.out.println("部署ID:" + deployment.getId());//
  System.out.println("部署名称:" + deployment.getName());//
 }

查看流程定义

public void findProcessDefinition() {
  List<ProcessDefinition> list = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
    .createProcessDefinitionQuery()// 创建一个流程定义的查询
    /** 指定查询条件,where条件 */
    // .deploymentId(deploymentId)//使用部署对象ID查询
    // .processDefinitionId(processDefinitionId)//使用流程定义ID查询
    // .processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
    // .processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询

    /** 排序 */
    .orderByProcessDefinitionVersion().asc()// 按照版本的升序排列
    // .orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列

    /** 返回的结果集 */
    .list();// 返回一个集合列表,封装流程定义
  // .singleResult();//返回惟一结果集
  // .count();//返回结果集数量
  // .listPage(firstResult, maxResults);//分页查询
  if (list != null && list.size() > 0) {
   for (ProcessDefinition pd : list) {
    System.out.println("流程定义ID:" + pd.getId());// 流程定义的key+版本+随机生成数
    System.out.println("流程定义的名称:" + pd.getName());// 对应helloworld.bpmn文件中的name属性值
    System.out.println("流程定义的key:" + pd.getKey());// 对应helloworld.bpmn文件中的id属性值
    System.out.println("流程定义的版本:" + pd.getVersion());// 当流程定义的key值相同的相同下,版本升级,默认1
    System.out.println("资源名称bpmn文件:" + pd.getResourceName());
    System.out.println("资源名称png文件:" + pd.getDiagramResourceName());
    System.out.println("部署对象ID:" + pd.getDeploymentId());
    System.out.println("#########################################################");
   }
  }
 }

说明:

1)                                流程定义和部署对象相关的Service都是RepositoryService

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

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

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

KeyName的值为:bpmn文件process节点的idname的属性值

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

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

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

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

删除流程定义

public void deleteProcessDefinition(){
  String deploymentId="101";//部署的id
  /**
   * 不带级联的删除
   *    只能删除没有启动的流程,如果流程启动,就会抛出异常
   */
     //processEngine.getRepositoryService().deleteDeployment(deploymentId);
  /**
   * 级联删除
   *    不管流程是否启动,都能可以删除
   */
  processEngine.getRepositoryService().deleteDeployment(deploymentId, true);
  System.out.println("删除成功!");
 }

说明:

1)        因为删除的是流程定义,而流程定义的部署是属于仓库服务的,所以应该先得到RepositoryService

2)        如果该流程定义下没有正在运行的流程,则可以用普通删除。如果是有关联的信息,用级联删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。

获取流程定义文档的资源(查看流程图附件)

public void viewPic() throws IOException{
  /**将生成图片放到文件夹下*/
  String deploymentId = "401";
  //获取图片资源名称
  List<String> list = processEngine.getRepositoryService()//
      .getDeploymentResourceNames(deploymentId);
  //定义图片资源的名称
  String resourceName = "";
  if(list!=null && list.size()>0){
   for(String name:list){
    if(name.indexOf(".png")>=0){
     resourceName = name;
     System.out.println("resourceName:"+resourceName);
    }
   }
  }
  //获取图片的输入流
  InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
  //将图片生成到D盘的目录下
  File file = new File("D:/"+resourceName);
  //将输入流的图片写到D盘下
  FileUtils.copyInputStreamToFile(in, file);
 }

1)        deploymentId为流程部署ID

2)        resourceNameact_ge_bytearray表中NAME_列的值

3)        使用repositoryServicegetDeploymentResourceNames方法可以获取指定部署下得所有文件的名称

4)        使用repositoryServicegetResourceAsStream方法传入部署ID和资源图片名称可以获取部署下指定名称文件的输入流

5)        最后的有关IO流的操作,使用FileUtils工具的copyInputStreamToFile方法完成流程流程到文件的拷贝,将资源文件以流的形式输出到指定文件夹下

 

  • 大小: 9.8 KB
分享到:
评论

相关推荐

    工作流Activiti5学习总结

    【工作流Activiti5学习总结】 工作流管理系统(Workflow Management System, WfMS)是企业信息化建设中的重要组成部分,它负责协调和管理业务流程。Activiti5是一款开源的工作流引擎,由Alfresco公司开发,它基于...

    Activiti第三天

    在学习Activiti的第三天,你将深入理解其核心概念和功能,为接下来的两天学习打下坚实基础。以下是对这一天学习内容的详细说明: 一、Activiti概述 Activiti是由Alfresco公司发起并维护的一个BPMN(Business ...

    Activiti工作流HelloWorld入门

    Activiti是一款开源的工作流引擎,它基于Java技术,用于在企业级应用中实现业务流程自动化。这个“Activiti工作流HelloWorld入门”旨在帮助初学者快速理解并掌握Activiti的基本用法。下面,我们将详细讲解如何创建一...

    工作流Activiti的学习总结(五)activiti的API和虚拟工作流测试.pdf

    在学习工作流Activiti的过程中,第五部分主要涵盖了Activiti API的使用和虚拟工作流的测试。Activiti是一个开源的工作流引擎,它提供了丰富的API来帮助开发者实现业务流程管理(BPM)功能。以下是对这些关键知识点的...

    activiti 第一天 共4天 视频教程

    这个“activiti 第一天 共4天 视频教程”显然是一个全面介绍Activiti的基础到进阶的学习资源,旨在帮助初学者快速理解和掌握这一强大的工具。 在第一天的课程中,通常会涵盖以下几个关键知识点: 1. **Activiti...

    传智播客 activiti 视频资料 第1天 共4天

    在第一天的学习中,我们还会涉及Activiti的流程历史记录和审计功能,这对于分析流程执行情况和进行性能优化是非常有用的。我们将学习如何查询历史流程实例、任务实例以及变量,以便进行流程审计和性能分析。 最后,...

    疯狂activiti工作流讲义

    13. **案例研究**:"疯狂activiti工作流讲义"很可能包含实际案例,让读者通过实践来理解和应用 Activiti,提升学习效果。 这些知识点覆盖了 Activiti 工作流框架的基础到高级应用,是理解并使用 Activiti 进行业务...

    自动建立activiti工作流数据库表

    Activiti 是一个开源的工作流和业务流程管理(BPM)系统,它被广泛用于企业级应用中,以实现流程自动化和提升工作效率。本教程将详细解释如何自动建立Activiti工作流所需的数据库表。 首先,理解Activiti的工作原理...

    activiti工作流需要的包及其他包

    Activiti工作流是一款开源的工作流程管理系统,用于设计、部署和执行业务流程。它基于Java平台,采用模型驱动的架构,提供了强大的流程定义和执行能力。在"activiti工作流需要的包(5.22.0版本)"中,包含了运行...

    工作流activiti5.22.0打包下载

    在本场景中,我们关注的是 Activiti 的第 5 版本的 22.0 版本,即 Activiti5.22.0。 1. **Activiti 简介** Activiti 是由 Alfresco 公司开发的一款 BPMN 2.0(Business Process Model and Notation)标准的流程...

    activiti-学习第一天

    ### 工作流基础知识与Activiti框架详解 #### 一、工作流概念解析 工作流(Workflow)是指“业务过程的部分或整体在计算机应用环境下的自动化”。它旨在通过自动化文档、信息或任务在多个参与者之间的传递流程,实现...

    基于Activiti5工作流实战企业协同OA办公系统教程第二部分

    在“第二章节”中,我们将会学习如何使用Activiti5实现基础的工作流操作,包括启动流程实例、处理任务和变更流程状态。而“通过变量设置参与者”这部分将更深入地讲解如何根据流程变量来动态分配任务,这是实现企业...

    Activiti工作流学习资料.zip

    Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM...

    基于Activiti5工作流实战企业协同OA办公系统教程第三部分

    在“第三章节”中,我们可能将学习到如何创建和部署流程定义。流程定义是工作流的核心,它描述了任务的顺序和交互规则。通常,我们会在Activiti的流程定义语言(BPMN 2.0 XML)中编写流程,然后通过Activiti引擎将其...

    activiti 第3天 共4天 视频教程

    Activiti 是一个开源的工作流引擎,它主要用于设计、部署和执行业务流程。这个"activiti 第3天 共4天 视频教程"很...通过完整的四天学习,开发者应该能对Activiti有全面的认识,并具备独立设计和实施工作流项目的能力。

    spring 整合 activiti工作流 相关jar包

    将Spring与Activiti整合,可以充分利用Spring的强大功能来管理和驱动Activiti工作流,实现灵活、可扩展且易于维护的业务流程解决方案。 1. **Spring框架**:Spring是一个开源的Java平台,提供了全面的企业应用程序...

    activiti-5.18 工作流的jra包 全部

    JRA包通常包含了Activiti核心库、数据库脚本、示例代码、以及必要的依赖库,这些对于开发者来说是实现和定制工作流系统的关键。在Activiti 5.18中,我们可以期待以下关键知识点: 1. **工作流引擎**:Activiti作为...

    传智播客 activiti 视频资料 第3天 共4天

    这个“传智播客 activiti 视频资料 第3天 共4天”的压缩包文件内容可能涵盖了Activiti的核心概念、安装配置、流程设计以及实际应用等内容。传智播客是一家知名的IT教育机构,他们的教程通常深入浅出,适合初学者入门...

    Activiti 学习笔记十:开始活动节点(判断流程是否结束及查询历史)

    Activiti 是一个开源的工作流引擎,它被广泛用于企业级应用中来管理业务流程。本学习笔记主要聚焦在开始活动节点以及如何判断流程是否结束,同时涵盖了查询历史流程实例的相关内容。 一、开始活动节点(Start Event...

    Activiti工作流对象

    ### Activiti工作流对象解析 #### 一、Activiti 数据表结构概述 Activiti是一款开源的工作流引擎,基于Java语言实现,提供了强大的流程定义、执行和监控能力。Activiti的数据表结构是其运行机制的核心组成部分之一...

Global site tag (gtag.js) - Google Analytics