Flowable流程引擎——02基本功能代码实现

本文介绍了Flowable流程引擎的基本功能实现,包括流程模版的查询、添加、删除、部署、流程图查询、XML导出、版本分页列表查询及版本的挂起与激活操作。详细阐述了各个功能的实现逻辑。

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

背景

疫情复燃,居家隔离了20多天!刚刚解封,致敬那些抗疫英雄们!马上过年了,2021年加油吧!

功能

1.流程模版列表查询
    @Qualifier("processEngine")
    @Autowired
    private ProcessEngine processEngine;
    @Autowired
    private ModelRepository modelRepository;
    @Autowired
    private ModelService modelService;

//查询流程模版列表
public List<FlowPageRespDTO> modelPage() {
   
        RepositoryService repositoryService = processEngine.getRepositoryService();
        ManagementService managementService = processEngine.getManagementService();
        List<Model> modelList = modelRepository.findByModelType(0, "modifiedDesc");
        ArrayList<FlowPageRespDTO> maps = new ArrayList<>();
        modelList.forEach(v -> {
   
            FlowPageRespDTO dto = new FlowPageRespDTO();
            dto.setGetId(v.getId());
            dto.setGetName(v.getName());
            dto.setGetKey(v.getKey());
            dto.setCreateName(v.getCreatedBy());
            dto.setLastUpdateTime(DateUtils.dateToStr(v.getLastUpdated()));
            dto.setCreateTime(DateUtils.dateToStr(v.getCreated()));
            dto.setLastUpdatedName(v.getLastUpdatedBy());
            List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(v.getKey()).list();
            dto.setPublishState(list.size() > 0 ? 1 : 0);
            List<ProcessDefinition> maxProcess = repositoryService.createNativeProcessDefinitionQuery().sql("select * from " + managementService.getTableName(ProcessDefinition.class) +
                    " P where P.KEY_=#{key} and P.VERSION_=(select Max(VERSION_) from " + managementService.getTableName(ProcessDefinition.class) + " S where S.KEY_=#{key})")
                    .parameter("key", v.getKey())
                    .list();
            dto.setGetVersion(maxProcess.size() > 0 ? maxProcess.get(0).getVersion() : 0);
            maps.add(dto);
        });
        return maps;
    }

返回的DTO实体

@ApiModel(value = "流程列表返回实体")
public class FlowPageRespDTO {
   
    @ApiModelProperty(value = "id")
    private String getId;
    @ApiModelProperty(value = "名")
    
### 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、付费专栏及课程。

余额充值