diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobNotifySceneEnum.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobNotifySceneEnum.java index 2a10c27f..006fa7e6 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobNotifySceneEnum.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobNotifySceneEnum.java @@ -13,13 +13,10 @@ public enum JobNotifySceneEnum { /********************************Job****************************************/ JOB_TASK_ERROR(1, "JOB任务执行失败", NodeTypeEnum.SERVER), - + JOB_CLIENT_ERROR(2, "客户端执行失败", NodeTypeEnum.CLIENT), /********************************Workflow****************************************/ - WORKFLOW_TASK_ERROR(100, "Workflow任务执行失败", NodeTypeEnum.SERVER), - WORKFLOW_TASK_CALLBACK_ERROR(101, "回调节点任务执行失败", NodeTypeEnum.SERVER), - WORKFLOW_TASK_DECISION_ERROR(102, "判定节点任务执行失败", NodeTypeEnum.SERVER), - + WORKFLOW_TASK_ERROR(100, "Workflow任务执行失败", NodeTypeEnum.SERVER) ; /** diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobOperationReasonEnum.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobOperationReasonEnum.java index 95e0263a..f56146ab 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobOperationReasonEnum.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/enums/JobOperationReasonEnum.java @@ -6,6 +6,7 @@ import lombok.Getter; import java.util.Arrays; import java.util.List; +import java.util.Objects; /** * 标识某个操作的具体原因 @@ -47,4 +48,10 @@ public enum JobOperationReasonEnum { WORKFLOW_NODE_NO_REQUIRED.getReason(), WORKFLOW_DECISION_FAILED.getReason(), WORKFLOW_CONDITION_NODE_EXECUTION_ERROR.getReason()); + public static JobOperationReasonEnum getByReason(Integer reason) { + if (Objects.isNull(reason)) { + return NONE; + } + return Arrays.stream(values()).filter(e -> reason.equals(e.reason)).findFirst().orElse(NONE); + } } diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java index 8b7dd9a1..f773bd0f 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/alarm/AbstractAlarm.java @@ -25,11 +25,14 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.util.concurrent.RateLimiter; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.scheduling.TaskScheduler; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalApplicationListener; import org.springframework.util.CollectionUtils; import java.time.Duration; @@ -43,7 +46,8 @@ import java.util.stream.Collectors; * @since 2.5.0 */ @Slf4j -public abstract class AbstractAlarm implements ApplicationListener, +public abstract class AbstractAlarm implements + TransactionalApplicationListener, Runnable, Lifecycle { @@ -218,6 +222,12 @@ public abstract class AbstractAlarm 组名称:{} \s > 任务名称:{} \s > 执行器名称:{} \s + > 失败原因:{} \s > 方法参数:{} \s > 时间:{}; """; @@ -72,17 +75,19 @@ public class JobTaskFailAlarmListener extends AbstractJobAlarm new SnailJobServerException("更新任务失败")); + if (JobTaskBatchStatusEnum.NOT_SUCCESS.contains(taskStatus)) { + SpringContext.getContext().publishEvent(new JobTaskFailAlarmEvent(taskExecute.getTaskBatchId())); + } + } private void doHandlerResidentTask(Job job, TaskExecuteDTO taskExecuteDTO) { diff --git a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/job/RequestClientActor.java b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/job/RequestClientActor.java index c84d2a1c..0a7701ed 100644 --- a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/job/RequestClientActor.java +++ b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/executor/job/RequestClientActor.java @@ -4,6 +4,7 @@ import akka.actor.AbstractActor; import akka.actor.ActorRef; import com.aizuda.snailjob.client.model.ExecuteResult; import com.aizuda.snailjob.client.model.request.DispatchJobRequest; +import com.aizuda.snailjob.common.core.context.SpringContext; import com.aizuda.snailjob.common.core.enums.JobTaskStatusEnum; import com.aizuda.snailjob.common.core.enums.StatusEnum; import com.aizuda.snailjob.common.log.SnailJobLog; @@ -19,6 +20,7 @@ import com.aizuda.snailjob.server.common.dto.JobLogMetaDTO; import com.aizuda.snailjob.server.job.task.dto.RealJobExecutorDTO; import com.aizuda.snailjob.server.job.task.support.ClientCallbackHandler; import com.aizuda.snailjob.server.job.task.support.JobTaskConverter; +import com.aizuda.snailjob.server.job.task.support.alarm.event.JobTaskFailAlarmEvent; import com.aizuda.snailjob.server.job.task.support.callback.ClientCallbackContext; import com.aizuda.snailjob.server.job.task.support.callback.ClientCallbackFactory; import com.github.rholder.retry.Attempt; @@ -92,15 +94,15 @@ public class RequestClientActor extends AbstractActor { } } catch (Exception e) { - Throwable throwable = e; + Throwable throwable; if (e.getClass().isAssignableFrom(RetryException.class)) { RetryException re = (RetryException) e; throwable = re.getLastFailedAttempt().getExceptionCause(); - } - - if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) { + } else if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) { UndeclaredThrowableException re = (UndeclaredThrowableException) e; throwable = re.getUndeclaredThrowable(); + } else { + throwable = e; } JobLogMetaDTO jobLogMetaDTO = JobTaskConverter.INSTANCE.toJobLogDTO(realJobExecutorDTO); @@ -114,7 +116,7 @@ public class RequestClientActor extends AbstractActor { } taskExecuteFailure(realJobExecutorDTO, throwable.getMessage()); - + SpringContext.getContext().publishEvent(new JobTaskFailAlarmEvent(dispatchJobRequest.getTaskBatchId())); } } diff --git a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/prepare/job/RunningJobPrepareHandler.java b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/prepare/job/RunningJobPrepareHandler.java index 8d021f0e..28177720 100644 --- a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/prepare/job/RunningJobPrepareHandler.java +++ b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/prepare/job/RunningJobPrepareHandler.java @@ -1,5 +1,6 @@ package com.aizuda.snailjob.server.job.task.support.prepare.job; +import com.aizuda.snailjob.common.core.context.SpringContext; import com.aizuda.snailjob.common.core.enums.JobOperationReasonEnum; import com.aizuda.snailjob.common.core.enums.JobTaskBatchStatusEnum; import com.aizuda.snailjob.common.core.util.JsonUtil; @@ -9,6 +10,7 @@ import com.aizuda.snailjob.server.job.task.support.BlockStrategy; import com.aizuda.snailjob.server.job.task.support.JobTaskConverter; import com.aizuda.snailjob.server.job.task.dto.JobTaskPrepareDTO; import com.aizuda.snailjob.server.job.task.support.JobTaskStopHandler; +import com.aizuda.snailjob.server.job.task.support.alarm.event.JobTaskFailAlarmEvent; import com.aizuda.snailjob.server.job.task.support.block.job.BlockStrategyContext; import com.aizuda.snailjob.server.job.task.support.block.job.JobBlockStrategyFactory; import com.aizuda.snailjob.server.job.task.support.stop.JobTaskStopFactory; @@ -62,6 +64,7 @@ public class RunningJobPrepareHandler extends AbstractJobPrePareHandler { stopJobContext.setJobOperationReason(JobOperationReasonEnum.TASK_EXECUTION_TIMEOUT.getReason()); stopJobContext.setNeedUpdateTaskStatus(Boolean.TRUE); instanceInterrupt.stop(stopJobContext); + SpringContext.getContext().publishEvent(new JobTaskFailAlarmEvent(prepare.getTaskBatchId())); } } diff --git a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/stop/AbstractJobTaskStopHandler.java b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/stop/AbstractJobTaskStopHandler.java index 7fd2b769..6761e26c 100644 --- a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/stop/AbstractJobTaskStopHandler.java +++ b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/stop/AbstractJobTaskStopHandler.java @@ -1,12 +1,14 @@ package com.aizuda.snailjob.server.job.task.support.stop; import akka.actor.ActorRef; +import com.aizuda.snailjob.common.core.context.SpringContext; import com.aizuda.snailjob.common.core.enums.JobTaskBatchStatusEnum; import com.aizuda.snailjob.common.core.enums.JobTaskStatusEnum; import com.aizuda.snailjob.server.common.akka.ActorGenerator; import com.aizuda.snailjob.server.job.task.support.JobTaskConverter; import com.aizuda.snailjob.server.job.task.dto.JobExecutorResultDTO; import com.aizuda.snailjob.server.job.task.support.JobTaskStopHandler; +import com.aizuda.snailjob.server.job.task.support.alarm.event.JobTaskFailAlarmEvent; import com.aizuda.snailjob.template.datasource.persistence.mapper.JobTaskBatchMapper; import com.aizuda.snailjob.template.datasource.persistence.mapper.JobTaskMapper; import com.aizuda.snailjob.template.datasource.persistence.po.JobTask;