activiti工作流中的java service节点的怎么使用

activiti工作流中的java service节点的怎么使用,第1张

一般而言 java service节点 是 service task节点上的派生,不是BPMN20中的规范,是activiti专门为Java准备的。其中class是指向实现了指定接口的Java类 expression 是表达式

在查询流程实例时,通过 businessKey(业务标识 )关联查询业务系统的请假单表,查询出请假天

数等信息。

*** 作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停:

流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将

全部挂起暂停执行。

*** 作流程实例对象,针对单个流程执行挂起 *** 作,某个流程实例挂起则此流程不再继续执行,完成

该流程实例的当前任务将报异常。

讲bpmn流程文件中节点的assignee 使用UEL表达式赋值( ${assignee0} )

任务监听器是发生对应的任务相关事件时执行自定义 java 逻辑 或表达式。

Create:任务创建后触发

Assignment:任务分配后触发

Delete:任务完成后触发

All:所有事件发生都触发

定义任务监听类,且类必须实现 orgactivitienginedelegateTaskListener 接口

在部门经理审核前设置流程变量,变量值为请假单信息(包括请假天数),部门经理审核后可以根据

流程变量的值决定流程走向。

通过流程实例 id 设置全局变量,该流程实例必须未执行完成。

任务办理时设置 local 流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无

法在当前流程实例使用,可以通过查询历史任务查询。

注意:

任务 id 必须是当前待办任务 id,act_ru_task 中存在。

公司业务需求要求显示流程图的执行的线路高亮

然后就开始了漫长的复制粘贴之旅

因为activiti不会对走过Flow进行记录,只对活动做记录,基本思路就是通过historyService可以获取到所有的HistoricActivityInstance,然后通过活动顺序再获取到执行过的flowId

但是这里有一个巨坑,这个HistoricActivityInstance是无序的,里面并没有字段可以对其进行排序,网上有很多文章说是用开始时间进行排序

但这是根本就是扯淡,开始时间根本不能排序,因为很多活动都是一瞬间完成的,开始时间是完全相同的,比如开始事件和第一个活动,比如排他网关和执行的下一个活动,所以根本无法排序,同理结束时间也无法进行排序。

还有很多文章写了很复杂的算法来获取到执行过的线路,但是都是没有用,不是少了就是多了。

最后仔细的研究了HistoricActivityInstance这个类,发现其实是有规律的,那就是一个活动结束的时间是和下一个执行的活动的开始时间,如果当前Activity的结束时间和下一个Activity的开始时间相等两个活动中间的Flow就走过,知道原理就好办了。

一个流程中,流程实例只有一个,执行对象可以有多个(如果存在分支和聚合)

SELECT FROM activitiact_ru_execution a; #正在执行的执行对象表

SELECT FROM activitiact_hi_procinst a; #流程实例的历史表

SELECT FROM activitiact_ru_task a; #正在执行的任务表(只有节点是UserTask的时候,该表中才存在数据)

SELECT FROM activitiact_hi_taskinst a; #任务历史表(只有节点是UserTask的时候,该表中才存在数据)

SELECT FROM activitiact_hi_actinst a; #所有节点的历史表

act_re_model 用于存放流程模型

act_re_procdef 用于存放流程定义

act_re_deployment 用于存放流程部署

act_ge_bytearray 用于存放各种二进制文件信息(包括流程模型的json,流程定义的xml以及他们各自对应的预览图以及流程进行中的数组参数)

act_re_procdef中会记录该流程定义所对应的部署id

同时,act_ge_bytearray中会记录流程定义所对应的xml和预览图(通过bytearray表中的deploymentId来记录),NAME字段会明确写出是xml还是预览图

也会记录流程模型所对应的json和预览图(act_re_model表中,EDITOR_SOURCE_VALUE_ID_记录的是json,EDITOR_SOURCE_EXTRA_VALUE_ID_记录的是预览图,都对应是act_ge_bytearray表中的ID)

execution是流程实例中的执行器,会有不止一个。

首先要说明,execution和task是两个独立的概念。

每一个节点正在进行的时候,必然会有一个execution停留在这个节点上,但是未必会有task

只有task类节点(如UserTask/EmailTask等等)会生成task(进行中的task存在act_ru_task表中),所以用task是否存在来判断该节点是否在进行是不妥当的。

但是task类节点通常会阻塞,等待人为调用接口来让其流转(最典型的就是UserTask),所以流转的接口才需要传入task。

这时候,task会进入act_hi_taskinst表中。

0首先一个流程实例启动,必然会有一个根execution(我们后面称为exec0)

1随后,exec0会生成一个子exec1并放置于流程图的开始节点(可以在act_ru_execution表中找到,父子execution使用表中的PARENT_ID_进行关联)。

2接着,exec1会根据流程图向前走。如果遇到并行网关,则会分裂。这里假设并行网关有两条支线,则会分裂出一个exec2

exec1和exec2分别走向并行网关的两条支线。最后在并行网关会合时,exec2被销毁。exec1继续复用,走下面的流程。

3根据流程图的不同,execution会分裂出若干个同级/子exection。例如上文提到的并行网关,以及后面要讲解的“调用活动”(callActivity)

下面有一个callActivity对应的例子图,可以参考。

未完待续

java工作流怎么用activity常用的是:activiti-engine-591jar,activiti-spring-59jar;解释:以上两个只是activiti工作流的常用包,通常会配置如spring开发的java包,还有数据库jar包等进行使用,但具体要用到什么包,这个和业务开发的逻辑有关系,也没法进行详细说明的,所以只需要先下载常用的两个,其余的辅助包如:日志包、spring包、数据库包、hibernate包、struts包、mybatis包等根据实际需要添加即可。

当前版本为activiti60,与之前版本区别

assignee:任务执行人,设置系统中的“登录名”(loginName)。

candidateUsers:任务执行人,可以填写多个。

candidateGroups:任务执行组,可以填写多个,设置系统中的“角色英文名(enname)”。

assignee和candidateUsers的区别是:assignee不需要签收任务,直接可执行任务;candidateUsers为竞争方式分配任务,被指定人待办中都有一条任务,谁先签收谁就获得任务的执行权。

taskServicesetAssignee(String taskId, String userId);

taskServiceclaim(String taskId, String userId);

taskServicesetOwner(String taskId, String userId);

关于上面三个方法的区别:

setAssignee和claim两个的区别是在认领任务时,claim会检查该任务是否已经被认领,如果被认领则会抛出ActivitiTaskAlreadyClaimedException 而setAssignee不会进行这样的检查。其他方面两个方法效果一致。

setOwner和setAssignee的区别在于

setOwner实在代理任务时使用,代表着任务的归属者,而这时,setAssignee代表的时代理办理者,

举个例子来说,公司总经理现在有个任务taskA,去核实一下本年度的财务报表,他现在又很忙没时间,于是将该任务委托给其助理进行办理,此时,就应该这么做:

taskServicesetOwner(taskAgetId(), 总经理getId());

taskServicesetAssignee/claim(taskAgetId(), 助理getId());

act_hi_taskinst表两个字段:

DELEGATION_和OWENER_

DELEGATION_值变化为PENDING,表示此任务为正在执行的委托任务;

DELEGATION_值变化为 RESOLVED,表示此任务为被解决的委托任务;

所以任务在被委托人执行时必须

taskServiceresolveTask(taskgetId(),taskVariables);//解决委托

taskServicecomplete(taskgetId(), taskVariables);//完成任务

否则容易报错A delegated task cannot be completed, but should be resolved instead

OWENR_字段设置用于查询委任人的委托任务

在执行taskServiceaddComment前,需要设置批注的所属人AuthenticationsetAuthenticatedUserId(userId);

在流程启动实例之前,设置启动者identityServicesetAuthenticatedUserId(userId);

然后流程设计模型可在流程开始节点设置变量,以供之后的环节使用

级联删除会把流程实例流程历史全部物理清空。

非级联删除,必须保证没有流程实例

二者虽然都能查询到任务实例。但是前者只能查询历史环节,就算act_hi_taskinst有数据未完成当前环节也不能查出

Activiti工作流总共包含23张数据表,所有的表名默认以“ ACT_ ”开头。并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配

用来保存部署文件的大文本数据。

保存流程定义和xml、Serializable(序列化)的变量,即保存所有二进制数据,特别注意类路径部署时候,不要把svn等隐藏文件或者其他与流程无关的文件也一起部署到该表中,会造成一些错误(可能导致流程定义无法删除)。

属性数据表。存储这个流程引擎级别的数据。

历史活动信息。这里记录流程流转过的所有节点,与HI_TASKINST不同的是,taskinst只记录usertask内容。

附件信息

历史审批意见表

历史详情表:流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。

任务参与者数据表。主要存储历史节点参与者的信息。

历史流程实例信息

历史任务流程实例信息

历史变量信息

用户组表,用来存储用户组信息。

用户扩展信息表。

用来保存用户的分组信息

用户信息表

部署信息表, 用来存储部署时需要持久化保存下来的信息

流程设计模型表,创建流程的设计模型时,保存在该数据表中。

流程解析表,解析成功了,在该表保存一条记录。业务流程定义数据表

运行时事件

运行时流程执行实例,我的代办任务查询表

身份联系,主要存储当前节点参与者的信息,任务参与者数据表。

运行时定时任务数据表

运行时任务数据表

运行时流程变量数据表

以上就是关于activiti工作流中的java service节点的怎么使用全部的内容,包括:activiti工作流中的java service节点的怎么使用、Activiti7工作流引擎进阶、Activiti流程图跟踪遇到的坑等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9658283.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存