商务服务
Activiti入门文档
2024-11-17 03:51

本文介绍与Activiti工作流具体操作相关的API。

Activiti入门文档

activiti.cfg.xml是一个spring依赖注入的xml文件,其具体内容可以参考 Spring集成activiti 测试类



和流程部署相关的表

表名 中文名 解释 act_re_deployment 部署对象信息表 存放流程定义的显示名称和部署时间,部署一次增加一条记录,注意:当流程定义的key相同的情况下,使用的是版本升级 act_re_procdef 流程定义表 存放流程定义的属性信息,部署每一个新的流程定义都会在这张表中增加一条记录 act_ge_bytearray 资源文件表 存储流程定义相关的部署信息,即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图),两个文件不是很大,都是以二进制形式存储在数据库中。 act_ge_property 主键生成策略表 -

从classpath部署流程


从zip部署流程


inputStream方式部署


几种获取inputStrem的方式及其异同 当testVariables.bpmn文件存在于 目录下且下面的代码在helloworld.bpmn的同目录下的类中时,有以下几种获取InputStream的方式



查询流程定义


查询所有最新的流程定义


小结

  1. 流程定义和部署对象相关的service都是RepositoryService
  2. 创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询的相关参数
  3. 调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表
  4. 运行结果可以看出, Key和Name的值为:bpmn文件process节点的id和name的属性值 <process id="LeaveFlow" name="请假流程" isExecutable="true">
  5. key属性被用来区别不同的流程定义
  6. 带有特定key的流程定义第一次部署时,版本为1.之后每次部署都会在当前最高版本号上加1
  7. Id的值的生成规则为: {processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字
  8. 重复部署一次,deploymentId的值以一定的形式变化,规则act_ge_property表生成

删除流程定义--根据部署ID删除


删除流程定义--删除key相同的所有不同版本的流程定义


小结

  1. 因为删除的是流程定义,而流程定义的部署是属于仓库服务的,所以应该先得到RepositoryService
  2. 如果该流程定义下没有正在运行的流程,则可以用普通删除。如果是有关联的信息,用级联删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。


流程实例对象:ProcessInstance代表流程定义的实例。如范冰冰请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。

执行对象:Activiti 用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同 ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。

流程图依旧接着第一部分的流程图(helloworld.bpmn)。 在做后面的启动流程实例和完成任务的过程中,完成以下查询。


测试类




做一下如下查询


会发现,流程实例和执行对象相同。

查询运行时是否存在流程实例来判断流程是正在进行中还是已结束。



流程图接着第一部分的流程图(helloworld.bpmn)。 测试类接着第二部分的测试类。





测试类





流程执行完后,历史流程实例的endTime,durationInMillis将会有数据,在执行完之前,endTime,durationInMillis为空。












流程变量的作用:

  1. 用来传递业务参数
  2. 指定连线完成任务(同意和拒绝)
  3. 动态指定任务的办理人

和流程变量相关的表:

column 中文名 act_ru_variable 正在执行的流程变量表 act_hi_varinst 历史的流程变量表

测试类定义如下



流程变量支持的数据类型







用HashMap同时设置多个参数--runtimeService和taskService均可设置流程变量


启动流程实例时设置流程变量


完成任务时设置流程变量


设置流程变量仅在当前任务有效--Local



根据variableName获取值--runtimeService和taskService均可获取流程变量


根据执行对象ID或taskId获取键值的HashMap集合(全部的)


传入指定的variableNames(HashMap)获取键值的HashMap集合(指定name的)





定义Person类


设置流程变量


值得注意的是,serializable类型的参数值是二进制类型的,会存放到 act_ge_bytearray 表中,当一个javabean(实现序列化)放置到流程变量中,要求javabean的属性不能再发生变化,如果发生变化,再获取的时候,抛出异常(假定你在Person中再加一个education属性,那么你再获取先前set的值,则取不出来了),要解决这个问题,需要给Person类添加序列化ID。


获取person






测试类


参数传入“不重要”,走连线a


参数传入“重要”,走连线b




测试类


完成任务--money参数分别传入800,1200,300


小结

  1. 一个排他网关对应一个以上的顺序流
  2. 由排他网关流出的顺序流都有个conditionexpression 元素,在内部维护返回boolean类型的决策结果。
  3. 决策网关只会返回一条结果,当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。
  4. 如果没有任何一个出口符合条件,则抛出异常。
  5. 如果流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有符合的条件,则以默认的连线(Default Flow)离开。

测试类


依次完成任务


流程执行过程

当启动流程实例时


当所有任务完成后

代码

小结

  1. 结束节点没有出口
  2. 其它节点有一个或多个出口 如果有一个出口,则代表是一个单线流程 如果有多个出口,则代表是开启并发流程

概念

接收任务是一个简单任务,它会等待对应消息的到达。当前,官方只实现了这个任务的java语义。当流程达到接收任务,流程状态会保存到数据库中。

在任务创建后,意味着流程会进入等待状态直到引擎接收了一个特定的消息,这会触发流程穿过接收任务继续执行。

流程图

代码


小结:

  1. 当前任务(一般指机器自动完成,但需要耗费一定时间的工作)完成后,向后推移流程,可以调用runtimeService.signal(executionId),传递接收执行对象的ID
  2. receiveTask在act_ru_task表中是不会产生数据的

任务分配包括个人任务分配和组任务分配,两者均存在3种任务分配方式:

  • 直接指定办理人--先前的任务分配均是此种,指定具体的人来办理;
  • 使用流程变量动态分配;
  • 实现 org.activiti.engine.delegate.TaskListener 接口动态分配任务。

Ⅰ 直接指定任务办理人

Ⅱ 使用流程变量动态分配任务办理人

我们可以在流程启动时,指定流程变量userId


当然,你也可以在其它地方指定流程变量userId,譬如,本次任务完成时,指定下一个任务的办理人,在某个条件下通过来指定任务办理人。

Ⅲ 实现 org.activiti.engine.delegate.TaskListener 接口动态分配任务。

先设置Main Config下的Assignee的值为空

在Listener下,指定类 TaskListenerImpl ,实现接口org.activiti.engine.delegate.TaskListener

New的内容如下:


TaskListenerImpl 类定义如下


在启动流程实例时,会执行回调函数。

当然,你也可以在指定了任务办理人后再重新分配任务办理人(认领任务)。


小结

个人任务及三种分配方式:

  1. 在taskProcess.bpmn中直接写assignee="张三丰"
  2. 在taskProcess.bpmn中写 assignee="#{userId}",变量的值是String的。使用流程变量指定办理人。
  3. 使用TaskListener接口,要使类实现该接口,在实现方法中调用 delegateTask.setAssignee(assignee) 来指定个人任务的办理人。

最后,还可以通过任务ID和办理人重新指定办理人:



流程图

和组任务相关的表 a.任务表(个人任务,组任务)


b.历史任务办理人表


做如下操作


Ⅰ 直接指定任务办理人

查询我的组任务


查询正在执行的任务办理人表


查询历史任务的办理人表


拾取任务,将组任务分配给个人任务,指定任务的办理人字段


将个人任务回退到组任务,前提,之前一定是个组任务


向组任务中添加成员


从组任务中删除成员


说明:

  1. 小A,小B,小C,小D是组任务的办理人
  2. 这样分配组任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中
  3. act_ru_identitylink表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务。
  4. act_hi_identitylink表存放任务的办理人,包括个人任务和组任务,表示历史任务

区别在于: 如果是个人任务TYPE的类型表示participant(参与者) 如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)

修改bpmn文件,指定Candidate users


启动流程实例时指定组成员


之后完成下面的步骤

  1. 启动完后,查询大大的组任务
  2. 指定大大拾取claim任务
  3. 拾取后,正在执行的任务表中,就有大大了
  4. 完成任务
  5. 查询历史任务表就能查询到大大完成了任务

在bpmn文件中指定Listener


编写TaskListenerImpl 类


后续完成下面的步骤

  1. 部署流程
  2. 启动流程
  3. 查询表:run任务表,act_run_execution表,act_ru_identitylink表
  4. 用郭靖查组任务
  5. 用郭靖拾取claim任务
  6. 查询执行任务表中,郭靖在表中
  7. 查询郭靖的个人任务
  8. 完成个人任务
  9. 查询表,act_hi_identitylink表,查询历史任务表

说明:

  1. 在类中使用delegateTask.addCandidateUser(userId); 的方式分配组任务的处理人,此时郭靖和黄蓉是下一个任务的办理人。

  2. 通过processEngine.getTaskService().claim(taskId, userId); 将组任务分配给个人任务,也叫认领任务,即指定某个人去办理这个任务,此时由郭靖办理任务。

    注意:认领任务的时候,可以是组任务成员中的人,也可以不是组任务成员中的人,此时通过TYPE的类型participant来指定任务的办理人

  3. addCandidateUser()即向组任务添加成员,deleteCandidateUser()即删除组任务的成员

  4. 在开发中,可以将每一个人物的办理人规定好,例如张三的领导是李四和王五,这样张三提交任务,由李四或者王五去查询组任务,可以看到对应张三的申请李四或王五在通过认领任务(claim)的方式,由某个人去完成这个任务。

小结:

组任务及三种分配方式:

  1. 在taskProcess.bpmn中直接写candidate-users="小A,小B,小C,小D"
  2. 在在taskProcess.bpmn中写candidate-users="#{userIDs}",变量的值要是String的。 使用流程变量指定办理人的代码如下

  1. 使用TaskListener接口,使用类实现该接口,在类中定义:

组任务分配给个人任务


个人任务分配给组任务:


向组任务添加成员:


向组任务删除人员:


个人任务和组任务存放办理人对应的表:


区别: - 如果是个人任务TYPE的类型表示participant(参与者) - 如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)

注:

  • bpmn文件中指定角色组
  • Main Config/Candidate groups 指定角色组:部门经理

在deploymentprocessDefinition方法的最后


  • 部署流程
  • 查询表

  • 启动流程实例

  • 查询act_ru_identitylink表,可以得知“审批”任务是一个组任务,其TYPE_字段值为candidate,其GROUP_ID的值为部门经理

  • 查询张三的组任务,可以查询到张三拥有“审批”这个组任务。

  • 查询李四的组任务,可以查询到李四拥有“审批”这个组任务。

  • 试一下王五呢,(已知:Main Config配置了角色)

  • 拾取任务给张三

  • 查询act_ru_task,就可以看到assignee就有值了,其值为张三

  • 完成任务

    以上就是本篇文章【Activiti入门文档】的全部内容了,欢迎阅览 ! 文章地址:http://lanlanwork.gawce.com/news/9674.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 阁恬下移动站 http://lanlanwork.gawce.com/mobile/ , 查看更多   
最新新闻
银行代销业务迎新规 银保渠道影响几何?
本文共2400字阅读完约5分钟 金融投资报记者 吉雪娇随着业务的快速发展,银行代销规范受到广泛关注。近日,国家金融监督管理总
12期免息下单送无线充 三星Note9苏宁开售三星双网双待手机「12期免息下单送无线充 三星Note9苏宁开售」
  【PConline 导购】近段时间市面上出现了很多定位于高端的手机,这些手机除了拥有旗舰级的配置外,还拥有自身的特色。相对于
荣耀MagicBook 14 2022集显版xda智能手机网「荣耀MagicBook 14 2022集显版」
备注:1.测试数据源自荣耀实验室,最大50W高性能需通过Fn+P开启高能模式。高能模式需要接通电源同步供电,默认为智能模式。2.测
旧手机坏了怎么找回微信聊天记录换了手机怎么找回微信聊天记录「旧手机坏了怎么找回微信聊天记录」
薄薄的水蓝色纱衣指的是(地球外部的)大气层。该句出自课文《只有一个地球》:“据有幸飞上太空的宇航员介绍,他们在天际遨游时
首播一天热度破9000!豆瓣好评如潮,观众放话:“一集就沦陷!”
文案|一十三编辑|苏打水这几年国产剧市场上,最令人惊喜的题材就是古装探案剧。比如成毅领衔的《莲花楼》将武侠与探案结合,英雄
为什么农夫山泉这么火,用了哪些营销套路?手机广告语「为什么农夫山泉这么火,用了哪些营销套路?」
前不久,农夫山泉拍摄的《长白山春夏秋》火了。无论是飞流直下的瀑布,还是潺潺的流水,亦或者郁郁葱葱的植被和嬉戏打闹的东北虎
我的世界宝可梦模组手机版(初心宝可梦)我的世界神奇宝贝手机版下载「我的世界宝可梦模组手机版(初心宝可梦)」
第 13 楼浙江台州台州职业技术学院 网友 客人 发表于: 2023/6/8 13:31:12 为什么没有显示要多少mb? 支持( 4 ) 盖楼(回复) 第 12
灵猫壁纸图库手机图库app「灵猫壁纸图库」
灵猫壁纸图库app是一款拥有独特动态壁纸资源的手机壁纸资源,这里有超多海量高清壁纸,个性化的超清壁纸,你需要的这里全部都有
重疾险困境与破局:分段给付理赔能否“救场”?
作为我国商业健康险曾经的“绝对主力”的重疾险,正站在转型的十字路口。2013年费率市场化改革后,人身险预定利率一路升至4%,兼
四川路桥:4月2日融资买入1940.01万元,融资融券余额1.91亿元
证券之星消息,4月2日,(600039)融资买入1940.01万元,融资偿还1751.02万元,融资净买入188.99万元,融资余额1.82亿元。融券方