/// <summary> /// 检查状态为计划制定中的作业,如果需要继续运行则返回true,否则返回false /// </summary> /// <returns><c>true</c>, if plan making job was checked, <c>false</c> otherwise.</returns> /// <param name="job">Job.</param> private bool CheckPlanMakingJob(JobBase job, CancellationToken cancellationToken = default) { int processId = job.GetProcessId("SplitJob"); // 没有进程Id,则认为作业在启动进程前就挂掉了或者进程没有启动成功 if (processId == -1) { LogWriter.Write("没有进程Id,启动作业分割进程前就挂掉了或者进程没有启动成功,将更新任务状态为初始"); job.UpdateJobStatus(EnumJobRecordStatus.Pending, cancellationToken); return(false); } // 获取进程 SwiftProcess.TryGetById(processId, job, "SplitJob", out SwiftProcess process); // 如果状态文件标示已经执行完毕,则更新作业状态 // 此时进程应该退出了,如果未退出可能是有未释放的资源,此时强行退出。 var jobSplitStatus = job.GetJobSplitStatus(); if (jobSplitStatus.ErrCode == 0) { LogWriter.Write("作业分割状态文件标示已经执行完毕,准备更新作业状态为计划制定完成"); job.UpdateJobStatus(EnumJobRecordStatus.PlanMaked, cancellationToken); if (process != null) { job.KillJobSplitProcess(); } return(false); } // 进程也没了,状态文件也不是完成,那还要分两种情况 if (process == null) { if (jobSplitStatus.ErrCode == 2 || jobSplitStatus.ErrCode == 4) { LogWriter.Write("找不到进程,状态为进行中或待执行,则回退到初始状态"); job.UpdateJobStatus(EnumJobRecordStatus.Pending, cancellationToken); } else { LogWriter.Write("找不到进程,状态错误,则修改为失败状态,需要调查"); job.UpdateJobStatus(EnumJobRecordStatus.PlanFailed, cancellationToken); } return(false); } // 如果根据进程Id找到进程,则启动监控运行作业 return(true); }