fix(sj_1.1.0-beta2): 优化事务问题

This commit is contained in:
opensnail 2024-07-04 13:03:47 +08:00
parent 27adf03420
commit 3a4382a9ab
2 changed files with 56 additions and 54 deletions

View File

@ -149,6 +149,10 @@ public class JobExecutorActor extends AbstractActor {
return; return;
} }
// 事务提交以后再执行任务
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCompletion(final int status) {
// 获取工作流的上下文 // 获取工作流的上下文
WorkflowTaskBatch workflowTaskBatch = null; WorkflowTaskBatch workflowTaskBatch = null;
Long workflowTaskBatchId = taskExecute.getWorkflowTaskBatchId(); Long workflowTaskBatchId = taskExecute.getWorkflowTaskBatchId();
@ -163,6 +167,9 @@ public class JobExecutorActor extends AbstractActor {
// 执行任务 // 执行任务
JobExecutor jobExecutor = JobExecutorFactory.getJobExecutor(job.getTaskType()); JobExecutor jobExecutor = JobExecutorFactory.getJobExecutor(job.getTaskType());
jobExecutor.execute(buildJobExecutorContext(taskExecute, job, taskList, workflowTaskBatch)); jobExecutor.execute(buildJobExecutorContext(taskExecute, job, taskList, workflowTaskBatch));
}
});
} finally { } finally {
log.debug("准备执行任务完成.[{}]", JsonUtil.toJsonString(taskExecute)); log.debug("准备执行任务完成.[{}]", JsonUtil.toJsonString(taskExecute));
final int finalTaskStatus = taskStatus; final int finalTaskStatus = taskStatus;

View File

@ -29,6 +29,7 @@ import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
@ -178,7 +179,6 @@ public class MapReduceTaskGenerator extends AbstractJobTaskGenerator {
return finalJobTasks; return finalJobTasks;
} }
@NotNull
private List<JobTask> createMapJobTasks(final JobTaskGenerateContext context) { private List<JobTask> createMapJobTasks(final JobTaskGenerateContext context) {
List<?> mapSubTask = context.getMapSubTask(); List<?> mapSubTask = context.getMapSubTask();
if (CollUtil.isEmpty(mapSubTask)) { if (CollUtil.isEmpty(mapSubTask)) {
@ -194,12 +194,8 @@ public class MapReduceTaskGenerator extends AbstractJobTaskGenerator {
.eq(JobTask::getLeaf, StatusEnum.YES.getStatus()) .eq(JobTask::getLeaf, StatusEnum.YES.getStatus())
); );
return transactionTemplate.execute(status -> {
List<JobTask> jobTasks = new ArrayList<>(mapSubTask.size()); List<JobTask> jobTasks = new ArrayList<>(mapSubTask.size());
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(final TransactionStatus status) {
for (int index = 0; index < mapSubTask.size(); index++) { for (int index = 0; index < mapSubTask.size(); index++) {
Pair<String, Integer> clientInfo = getClientNodeInfo(context); Pair<String, Integer> clientInfo = getClientNodeInfo(context);
@ -228,17 +224,16 @@ public class MapReduceTaskGenerator extends AbstractJobTaskGenerator {
// 更新父节点的为非叶子节点 // 更新父节点的为非叶子节点
if (Objects.nonNull(parentJobTask)) { if (Objects.nonNull(parentJobTask)) {
JobTask parentJobTask = new JobTask(); JobTask parentJobTask1 = new JobTask();
parentJobTask.setId(context.getParentId()); parentJobTask1.setId(context.getParentId());
parentJobTask.setLeaf(StatusEnum.NO.getStatus()); parentJobTask1.setLeaf(StatusEnum.NO.getStatus());
Assert.isTrue(1 == jobTaskMapper.updateById(parentJobTask), Assert.isTrue(1 == jobTaskMapper.updateById(parentJobTask1),
() -> new SnailJobMapReduceException("更新父节点失败")); () -> new SnailJobMapReduceException("更新父节点失败"));
} }
} return jobTasks;
}); });
return jobTasks;
} }
private Pair<String, Integer> getClientNodeInfo(JobTaskGenerateContext context) { private Pair<String, Integer> getClientNodeInfo(JobTaskGenerateContext context) {