Activiti BPM 6.0.0.3流程实例重分配问题咨询
嘿,我之前在Activiti 6.x版本里碰到过几乎一模一样的问题,给你几个经过验证的可行方案,针对你说的流程实例没有活跃人工任务的场景:
方案1:扩展Activiti的Mapper和Service,手动更新START_USER_ID_
默认的updateExecution方法确实不支持修改START_USER_ID_字段,那我们可以自己扩展核心操作:
- 先在自定义的IBatis Mapper XML文件里新增一个专门的更新语句,针对
ACT_RU_EXECUTION表的START_USER_ID_:
<update id="updateExecutionStartUserId" parameterType="java.util.Map"> UPDATE ACT_RU_EXECUTION SET START_USER_ID_ = #{newStartUserId} WHERE ID_ = #{executionId} AND PARENT_ID_ IS NULL </update>
这里加PARENT_ID_ IS NULL是为了确保只更新根流程实例的记录,避免误改子流程的execution。
- 然后在你自己封装的Activiti服务类里,注入
SqlSession对象,调用这个自定义的Mapper方法来执行更新操作。 - 记得要包裹在事务里,避免出现数据不一致的情况。
方案2:业务层补全负责人标记,结合历史表更新
如果不想改动Activiti的核心Mapper,可以从业务侧做兼容:
- 在你的业务数据库里新建一张关联表,比如
PROC_INST_ASSIGNEE,字段包括PROC_INST_ID_、ASSIGNEE_USER_ID、UPDATE_TIME,用来记录流程实例的实际负责人。 - 当需要重分配时,直接更新这张业务表的
ASSIGNEE_USER_ID;如果需要同步历史数据,也可以自定义Mapper更新ACT_HI_PROCINST表的START_USER_ID_(历史表的更新限制比运行时表少很多)。 - 后续系统查询流程负责人时,优先读取业务表的记录,没有的话再 fallback 到Activiti原生的
START_USER_ID_。
方案3:临时插入无感知人工任务(适合可修改流程定义的场景)
如果你有权限修改流程定义,可以用一个小技巧绕开运行时表的更新限制:
- 在流程的当前暂停节点后面,临时插入一个人工任务节点,设置自动分配给目标重分配用户,同时给这个任务加一个任务创建监听器。
- 监听器里做两件事:一是自动完成这个任务,二是调用自定义Mapper更新根流程实例的
START_USER_ID_。 - 这个任务会被自动创建并完成,用户完全感知不到,流程会继续正常流转,同时你也完成了负责人的更新。
几个关键注意点
- 不管用哪个方案,都要确保操作在事务中执行,避免流程状态和负责人字段更新不一致。
- 如果你的系统有基于用户的流程权限控制,重分配后一定要同步更新权限配置,确保新负责人能正常访问后续流程节点。
内容的提问来源于stack exchange,提问作者Dahakka
相关产品推荐
相关产品推荐

