feat: 2.6.0
1. 优化重试导致事务超时问题
This commit is contained in:
parent
e3206c611f
commit
0d9f885cc5
@ -62,29 +62,24 @@ public class JobExecutorResultActor extends AbstractActor {
|
||||
return receiveBuilder().match(JobExecutorResultDTO.class, result -> {
|
||||
log.info("更新任务状态. 参数:[{}]", JsonUtil.toJsonString(result));
|
||||
try {
|
||||
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
|
||||
@Override
|
||||
protected void doInTransactionWithoutResult(final TransactionStatus status) {
|
||||
JobTask jobTask = new JobTask();
|
||||
jobTask.setTaskStatus(result.getTaskStatus());
|
||||
if (Objects.nonNull(result.getResult())) {
|
||||
jobTask.setResultMessage(JsonUtil.toJsonString(result.getResult()));
|
||||
}
|
||||
JobTask jobTask = new JobTask();
|
||||
jobTask.setTaskStatus(result.getTaskStatus());
|
||||
if (Objects.nonNull(result.getResult())) {
|
||||
jobTask.setResultMessage(JsonUtil.toJsonString(result.getResult()));
|
||||
}
|
||||
|
||||
Assert.isTrue(1 == jobTaskMapper.update(jobTask,
|
||||
new LambdaUpdateWrapper<JobTask>().eq(JobTask::getId, result.getTaskId())),
|
||||
() -> new EasyRetryServerException("更新任务实例失败"));
|
||||
// 先尝试完成,若已完成则不需要通过获取分布式锁来完成
|
||||
boolean tryCompleteAndStop = tryCompleteAndStop(result);
|
||||
if (!tryCompleteAndStop) {
|
||||
// 存在并发问题
|
||||
distributedLockHandler.lockWithDisposableAndRetry(() -> {
|
||||
tryCompleteAndStop(result);
|
||||
}, MessageFormat.format(KEY, result.getTaskBatchId(),
|
||||
result.getJobId()), Duration.ofSeconds(3), Duration.ofSeconds(1), 6);
|
||||
}
|
||||
}
|
||||
});
|
||||
Assert.isTrue(1 == jobTaskMapper.update(jobTask,
|
||||
new LambdaUpdateWrapper<JobTask>().eq(JobTask::getId, result.getTaskId())),
|
||||
() -> new EasyRetryServerException("更新任务实例失败"));
|
||||
// 先尝试完成,若已完成则不需要通过获取分布式锁来完成
|
||||
boolean tryCompleteAndStop = tryCompleteAndStop(result);
|
||||
if (!tryCompleteAndStop) {
|
||||
// 存在并发问题
|
||||
distributedLockHandler.lockWithDisposableAndRetry(() -> {
|
||||
tryCompleteAndStop(result);
|
||||
}, MessageFormat.format(KEY, result.getTaskBatchId(),
|
||||
result.getJobId()), Duration.ofSeconds(2), Duration.ofSeconds(1), 3);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
EasyRetryLog.LOCAL.error(" job executor result exception. [{}]", result, e);
|
||||
} finally {
|
||||
|
@ -2,6 +2,7 @@ package com.aizuda.easy.retry.server.job.task.support.dispatch;
|
||||
|
||||
import akka.actor.AbstractActor;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import com.aizuda.easy.retry.common.core.constant.SystemConstants;
|
||||
import com.aizuda.easy.retry.common.core.enums.FailStrategyEnum;
|
||||
import com.aizuda.easy.retry.common.core.enums.JobOperationReasonEnum;
|
||||
import com.aizuda.easy.retry.common.core.enums.JobTaskBatchStatusEnum;
|
||||
@ -80,7 +81,9 @@ public class WorkflowExecutorActor extends AbstractActor {
|
||||
WorkflowTaskBatch workflowTaskBatch = workflowTaskBatchMapper.selectById(taskExecute.getWorkflowTaskBatchId());
|
||||
Assert.notNull(workflowTaskBatch, () -> new EasyRetryServerException("任务不存在"));
|
||||
|
||||
handlerTaskBatch(taskExecute, JobTaskBatchStatusEnum.RUNNING.getStatus(), JobOperationReasonEnum.NONE.getReason());
|
||||
if (SystemConstants.ROOT.equals(taskExecute.getParentId()) && JobTaskBatchStatusEnum.WAITING.getStatus() == workflowTaskBatch.getTaskBatchStatus()) {
|
||||
handlerTaskBatch(taskExecute, JobTaskBatchStatusEnum.RUNNING.getStatus(), JobOperationReasonEnum.NONE.getReason());
|
||||
}
|
||||
|
||||
// 获取DAG图
|
||||
String flowInfo = workflowTaskBatch.getFlowInfo();
|
||||
|
@ -80,24 +80,18 @@ public class JobTaskBatchGenerator {
|
||||
// 非待处理状态无需进入时间轮中
|
||||
if (JobTaskBatchStatusEnum.WAITING.getStatus() != jobTaskBatch.getTaskBatchStatus()) {
|
||||
|
||||
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||
@Override
|
||||
public void afterCompletion(int status) {
|
||||
if (Objects.nonNull(context.getWorkflowNodeId()) && Objects.nonNull(context.getWorkflowTaskBatchId())) {
|
||||
// 若是工作流则开启下一个任务
|
||||
try {
|
||||
WorkflowNodeTaskExecuteDTO taskExecuteDTO = new WorkflowNodeTaskExecuteDTO();
|
||||
taskExecuteDTO.setWorkflowTaskBatchId(context.getWorkflowTaskBatchId());
|
||||
taskExecuteDTO.setTaskExecutorScene(context.getTaskExecutorScene());
|
||||
taskExecuteDTO.setParentId(context.getWorkflowNodeId());
|
||||
ActorRef actorRef = ActorGenerator.workflowTaskExecutorActor();
|
||||
actorRef.tell(taskExecuteDTO, actorRef);
|
||||
} catch (Exception e) {
|
||||
log.error("任务调度执行失败", e);
|
||||
}
|
||||
if (TransactionSynchronizationManager.isActualTransactionActive()) {
|
||||
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||
@Override
|
||||
public void afterCompletion(int status) {
|
||||
openNextNode(context);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
openNextNode(context);
|
||||
}
|
||||
|
||||
|
||||
return jobTaskBatch;
|
||||
}
|
||||
|
||||
@ -115,4 +109,24 @@ public class JobTaskBatchGenerator {
|
||||
return jobTaskBatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* 工作流开启下一个节点
|
||||
* @param context
|
||||
*/
|
||||
private static void openNextNode(final JobTaskBatchGeneratorContext context) {
|
||||
if (Objects.nonNull(context.getWorkflowNodeId()) && Objects.nonNull(context.getWorkflowTaskBatchId())) {
|
||||
// 若是工作流则开启下一个任务
|
||||
try {
|
||||
WorkflowNodeTaskExecuteDTO taskExecuteDTO = new WorkflowNodeTaskExecuteDTO();
|
||||
taskExecuteDTO.setWorkflowTaskBatchId(context.getWorkflowTaskBatchId());
|
||||
taskExecuteDTO.setTaskExecutorScene(context.getTaskExecutorScene());
|
||||
taskExecuteDTO.setParentId(context.getWorkflowNodeId());
|
||||
ActorRef actorRef = ActorGenerator.workflowTaskExecutorActor();
|
||||
actorRef.tell(taskExecuteDTO, actorRef);
|
||||
} catch (Exception e) {
|
||||
log.error("任务调度执行失败", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -50,7 +50,6 @@ public class ReportLogHttpRequestHandler extends PostHttpRequestHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public String doHandler(String content, UrlQuery urlQuery, HttpHeaders headers) {
|
||||
|
||||
EasyRetryLog.LOCAL.info("Begin Handler Log Report Data. [{}]", content);
|
||||
|
Loading…
Reference in New Issue
Block a user