CompletableFuture 手动事务,工作记录

本文介绍了一个使用Java实现的任务完成机制,通过异步方式完成任务并更新任务状态,包括检查任务是否存在、验证反馈信息是否为空等步骤,并利用Spring事务管理确保操作的原子性。

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

/**
     * 完成任务
     *
     * @param command 完成信息
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void complete(CompleteTaskCommand command) {
        ProcessTaskDO processTask = this.processTaskMapper.selectUnfinishedByTaskId(command.getTaskId());
        if (processTask == null) {
            throw new CustomGenericException(ResponseCode.TASK_NOT_FOUND);
        }

        if (processTask.getFeedback() && StringUtils.isBlank(command.getFeedback())) {
            throw new CustomGenericException(ResponseCode.TASK_NEED_FEEDBACK);
        }
        JSONObject jsonObject = ConcurrentUserService.concurrentUser();
        CompletableFuture.runAsync(() -> {
            log.info("runAsync线程执行, 线程名:{},jsonObject:{}", Thread.currentThread().getName(), jsonObject);
            // 开启事务
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // 事物隔离级别,开启新事务
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            // 获得事务状态
            TransactionStatus status = dataSourceTransactionManager.getTransaction(def);
            try {
                // 完成任务
                if (CollectionUtil.isNotEmpty(command.getVariables())) {
                    this.taskService.complete(command.getTaskId(), command.getVariables());
                } else {
                    this.taskService.complete(command.getTaskId());
                }

                processTask.setEndReason("正常完成");
                if (processTask.getEndTime() == null) {
                    processTask.setEndTime(new Date());
                }
                processTask.setProcessInstanceId(command.getProcessInstanceId());
                processTask.setFeedbackComment(command.getFeedback());
                processTask.setStatus(ProcessTaskStatus.COMPLETED);
                processTask.setExecutionUser(jsonObject.getStr("id"));
                processTask.setVariable(JSONUtil.toJsonStr(command.getVariables()));
                this.save(processTask);
            } catch (Exception e) {
                // 事务回滚
                dataSourceTransactionManager.rollback(status);
                log.error("完成任务时发生异常,入参:{}", JSONUtil.toJsonStr(command), e);
                throw new RuntimeException("runAsync线程执行失败", e);
            } finally {
                // 手动提交
                if (status.isNewTransaction() && !status.isCompleted()) {
                    dataSourceTransactionManager.commit(status);
                }
            }
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值