java流程设计 如何回退,工作流程引擎回滚应用场景与设计需求

本文讨论了工作流程引擎在处理完成后如何进行回滚操作的两种场景,包括主流程和子流程的回滚。介绍了ccflow工作流程引擎的API方法`Flow_DoRebackWorkFlow`用于恢复已完成的流程到指定节点,并详细阐述了回滚过程中的关键步骤,如状态恢复、退回信息记录和日志管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作流程引擎回滚的应用背景:

场景1:一件流程在完成后,发现这个流程有问题,需要退回到流程指定的节点上与当时该节点的处理人身上,让他重做。

场景2:一个主流程启动了n个子流程,他在监控子流程时发现子流程问题,需要重新去做。

这两种场景下,都是在流程完全处理完后,并且流程引擎已经把该流程归档后要求重新回滚到指定的节点与该节点的处理人身上去,让其在重新去处理。

ccflow工作流程引擎回滚流程对应的API:

///

/// 恢复已完成的流程数据到指定的节点,如果节点为0就恢复到最后一个完成的节点上去.

/// 恢复失败抛出异常

///

/// 要恢复的流程编号

/// 要恢复的workid

/// 恢复到的节点编号,如果是0,标示回复到流程最后一个节点上去.

/// 恢复的原因,此原因会记录到日志

public static string Flow_DoRebackWorkFlow(string flowNo, Int64 workid, int backToNodeID, string note)

{

BP.WF.Ext.FlowSheet fs = new Ext.FlowSheet(flowNo);

return fs.DoRebackFlowData(workid, backToNodeID, note);

}

ccflow 工作流程引擎回滚流程的设计需求:

1, 回滚人接受到的信息是退回状态,而非流程的运行状态。

2, 回滚后流程数据表的状态由完成恢复到退回,最后结束节点恢复到回滚的点。

3, 恢复流程引擎注册表数据,当前表状态标示为退回。

4, 恢复流程工作人员表,把所有参与该流程上的工作人员都恢复里面去。

5, 写入一条退回信息,让接受人员能够看到退回的原因。

6, 写入到流程日志 ,保证它的完整可读。

### Flowable 中实现流程回滚的方法 在Flowable工作流引擎中,处理业务需求时可能会遇到需要撤销某些操作的情况。对于这种情况下的解决方案之一即为实现流程回滚机制。 #### 使用历史数据进行人工干预式的回滚 一种较为常见的做法是从历史上获取特定节点的信息,并手动触发前序节点的任务重新激活。这通常涉及到利用`HistoryService`接口读取历史记录[^1]: ```java // 获取历史服务组件 HistoryService historyService = processEngine.getHistoryService(); List<HistoricActivityInstance> historicInstances = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceEndTime().asc() .listPage(0, 1); if (!historicInstances.isEmpty()) { HistoricActivityInstance lastActiveNode = historicInstances.get(0); } ``` 此段代码展示了如何查找指定流程实例最近结束的一个活动节点。之后可以根据实际场景决定是否要恢复到这个位置或者更早的位置上。 #### 基于事件监听器自动化的回滚策略 另一种更为灵活的方式是借助自定义事件监听器,在异常发生时捕获错误信号并采取相应措施。可以创建一个继承自`ExecutionListener`抽象类的对象用于监控流程执行期间的状态变化;当检测到失败情况,则调用API来回退至某个已知的安全点: ```java public class RollbackOnFailure implements ExecutionListener { @Override public void notify(DelegateExecution execution) throws Exception { try { // 执行具体业务逻辑... } catch (Exception e) { String targetNodeId = "some_previous_node_id"; runtimeService.createChangeActivityStateBuilder() .processInstanceId(execution.getProcessInstanceId()) .moveActivityIdTo(targetNodeId).changeState(); } } } ``` 上述示例演示了一个简单的异常处理器,它会在捕捉到任何未处理的异常后尝试将当前线程状态转移到预先设定的目标节点上去。 #### 考虑使用事务子流程简化复杂度 如果应用程序中有多个连续的操作需要作为一个整体来进行管理——要么全部成功提交,要么完全取消掉——那么应该考虑采用事务型子流程设计模式。这种方式能够有效减少对外部补偿逻辑的需求,因为一旦内部任一环节出现问题,整个事物就会被标记为失败而不会影响其他部分[^4]. ```xml <subProcess id="transactionalSubProcess" isTransactional="true"> <!-- 子流程内的任务和其他元素 --> </subProcess> ``` 通过声明性的配置即可轻松启用这一特性,无需额外编写复杂的控制结构或回调函数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值