之前项目使用Activiti6.0时,遇到了一个回退问题记录一下。
先描述一下现象:
工作流和业务系统是分开的。业务系统需要往下走的时候,先调用工作流的接口,完成工作流当前节点,完成节点后根据配置的回调url地址去调用业务系统的接口完成业务操作。
这里会存在一个问题。就是如果工作流节点完成后,调用业务接口的时候,如果调用失败怎么办?当然是工作流节点需要回到原来的节点。因为工作流有回退的方法,传入流程实例id和目标的节点id,可以回退到指定的节点,以为来完成节点回滚操作。这个过程需要依赖于工作流内置的act_ru_task表去查询数据,完成回退操作。细节就不详细描述了。正常情况下这种回退是没有问题的,但是当完成节点的时候刚好流程结束了,调用业务失败,这个回退就无法进行了。
解决方法:
思路1:查询数据根据流程历史表查询,然后将待办任务数据造出来。这种方法需要对流程内置表的关系很熟悉,不然很容易让流程数据乱掉导致流程不能正常运行。
思路2:工作流提供的接口完成节点归根结底也是执行sql,增加事务控制,调用业务失败回滚事务,可以解决这个问题。因为调用业务返回前完成节点的事务还没有提交还可以回滚,这种只能解决上述描述的场景。如果业务场景换一下,先调用业务,后完成工作流节点,或者是调用的业务有多个。这个时候单纯的事务控制是不能回滚掉完成的业务的,需要引入分布式事务才能解决这个问题,分布式事务可以参考seata。