activiti需要用户信息吗?

在刚接触流程引擎Activiti的时候误以为必须得使用它所提供的用户管理,而一般来说在业务系统里本身就自带了一套用户管理,于是就去寻找同步用户数据到Activiti的ACTID*表中方法,找到了这篇文章。

但是在后面的使用过程中发现Activiti完全可以在没有用户信息的情况下运行,我们可以指派ACTID*表中根本不存在的用户或组给一个Task,然后使用TaskService查询这个Task。可以看Activiti论坛的这个回答。

经过观察后发现,Task的Assignee,Candidate Users,Candidate Groups信息只是以字符串形式保存在act_ru_tak和ACT_RU_IDENTITYLINK表中,更进一步证实了我的想法。

不过事情有一些例外,Activiti实际上在查询Task的时候,在某些情况下还是使用了ACTID*表中的数据,下面总结了出来。

taskCandidateOrAssigned

taskService.createTaskQuery().taskCandidateOrAssigned(userId);
当使用taskCandidateOrAssigned做查询条件时,Activiti会按照以下规则查找Task:

  1. Assignee匹配

  2. 或者*.bpmn中定义的Candidate Users 匹配

  3. 或者Candidate Group 匹配(用户所属用户组的信息从Activiti的ACTID*表获取)

可以从以下SQL看出它查找的逻辑:

select distinct RES.* from ACT_RU_TASK RES
left join ACT_RU_IDENTITYLINK I on I.TASKID = RES.ID
WHERE (
RES.ASSIGNEE
= ?
or (
RES.ASSIGNEE_ is null
and (
I.USERID = ?
or
I.GROUPID IN (
select g.GROUPID from ACT_ID_MEMBERSHIP g where g.USERID = ?
)
)
)
)

taskAssignee

taskService.createTaskQuery().taskAssignee(userId);
当使用taskAssignee做查询条件时,Activiti会按照以下规则查找Task:

  1. Assignee匹配。可以从以下SQL看出它查找的逻辑:

select distinct RES.* from ACT_RUTASK RES WHERE RES.ASSIGNEE = ?

taskCandidateGroup

taskService.createTaskQuery().taskCandidateGroup(userId);
当使用taskCandidateGroup做查询条件时,Activiti会按照以下规则查找Task:

  1. *.bpmn中定义的Candidate Groups匹配。可以从以下SQL看出它查找的逻辑:

select distinct RES.* from ACT_RU_TASK RES
inner join ACT_RU_IDENTITYLINK I on I.TASKID = RES.ID
WHERE RES.ASSIGNEE
is null
and I.TYPE_ = 'candidate'
and ( I.GROUPID IN ( ? ) )

taskCandidateUser

taskService.createTaskQuery().taskCandidateUser(userId);
当使用taskCandidateUser做查询条件时,Activiti会按照以下规则查找Task:

  1. 先查找用户所属的组(用户所属用户组的信息从Activiti的ACTID*表获取)

select g.* from ACT_ID_GROUP g, ACT_IDMEMBERSHIP membership
where g.ID
= membership.GROUPID
and membership.USERID = ?

  1. 如果找到了用户组信息,那么

*.bpmn中定义的Candidate Users 匹配

  1. 或者Candidate Group 匹配(用户所属用户组的信息从Activiti的ACTID*表获取)

select distinct RES.* from ACT_RU_TASK RES
inner join ACT_RU_IDENTITYLINK I on I.TASKID = RES.ID
WHERE RES.ASSIGNEE
is null
and I.TYPE_ = 'candidate'
and ( I.USERID = ? or I.GROUPID IN ( ? , ? ) )

  1. 如果找不到用户所属的组,那么和*.bpmn中定义的Candidate Users 匹配

select distinct RES.* from ACT_RU_TASK RES
inner join ACT_RU_IDENTITYLINK I on I.TASKID = RES.ID
WHERE RES.ASSIGNEE
is null
and I.TYPE_ = 'candidate'
and ( I.USERID = ? )

taskCandidateGroupIn

taskService.createTaskQuery().taskCandidateGroupIn(groups);
当使用taskOwner做查询条件时,Activiti会按照以下规则查找Task:

  1. *.bpmn中定义的Candidate Groups匹配(匹配一个就行)。可以从以下SQL看出它查找的逻辑:

select distinct RES.* from ACT_RU_TASK RES
inner join ACT_RU_IDENTITYLINK I on I.TASKID = RES.ID
WHERE RES.ASSIGNEE
is null
and I.TYPE_ = 'candidate'
and ( I.GROUPID IN ( ? , ? ) )

taskOwner

taskService.createTaskQuery().taskOwner(userId);
当使用taskOwner做查询条件时,Activiti会按照以下规则查找Task:

  1. *.bpmn中定义的owner匹配。可以从以下SQL看出它查找的逻辑:

select distinct RES.* from ACT_RUTASK RES
WHERE RES.OWNER
= ?

关键字:java, activiti, res, task


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部