前言
有段时间没更新了,最近项目快要上线,做了一个加签的需求如果以后有时间会写文章记录一下,原理其实跟之前提到的一样,其实camunda自己是有对应这个功能可用的api的,但因为我项目使用的版本是7.13还没有加入那个api,当时尝试研究了很多别的办法,最后都绕到一个问题上面——CommandContext、Context、ProcessApplicationReference这几个变量没法随时复用,这对当时的我来说是非常不能理解的事情,毕竟我的项目已经启动了,为什么不能复用上下文变量,最近还在跟源码希望能找到原因,如果有解决方案我也会第一时间分享。这个问题也导致加签的方案一改再改,最后还是使用的如下写法,提前声明这个方案明显不是最优解,如果加签实例多的话容易造成速度慢和异步问题,仅供参考。
实现方案
runtimeService.createProcessInstanceModification("processInstanceId")
.startBeforeActivity("Acitvity_xxx")
.setVariable("assignee", xxx)
.execute();
- 这样指定某个流程的某个节点(当然这些信息都要提前查出来),然后对它设置assignee审批人,单纯这样看代码很容易觉得,这不会影响之前创建的任务吗?看起来很像把这个节点变成只有一个审批人的任务?
- 实际上经过尝试发现这里的setVariable()方法并不能像上一篇文章设想的传递一个assigneeList更新所有审批人,camunda会提示无法识别assigneeList变量(尽管我已经反复确认流程图无误已经提前设置),反而传递这个单独的assignee变量只会创建一个新的userTask。
- 如果想办到删除这个任务节点之前创建的所有userTask需要额外调用cancelAllForActivity("Acitvity_xxx")方法,不然只会进行创建而不会删除。
最近在跟框架的源码,目前进度主要在分析自动配置类和命令模式执行、拦截器链顺序、数据库提交方式,应该近期还会更新一期分享。