Esempio n. 1
0
        /// <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 CheckTaskMergingJob(JobBase job, CancellationToken cancellationToken = default)
        {
            int processId = job.GetProcessId("CollectTaskResult");

            // 没有进程Id,则认为在启动进程前就挂掉了或者进程没有启动成功
            if (processId == -1)
            {
                LogWriter.Write("没有进程Id,启动任务合并进程前就挂掉了或者进程没有启动成功,将更新作业状态为TaskSynced");
                job.UpdateJobStatus(EnumJobRecordStatus.TaskSynced, cancellationToken);
                return(false);
            }

            // 获取进程
            SwiftProcess.TryGetById(processId, job, "CollectTaskResult", out SwiftProcess process);

            // 如果状态文件标示已经执行完毕,则更新作业状态
            // 此时进程应该退出了,如果未退出可能是有未释放的资源,此时强行退出。
            var collectTaskResultStatus = job.GetCollectTaskResultStatus();

            if (collectTaskResultStatus.ErrCode == 0)
            {
                LogWriter.Write("任务合并状态文件标示已经执行完毕,准备更新作业状态为TaskMerged");
                job.UpdateJobStatus(EnumJobRecordStatus.TaskMerged, cancellationToken);

                if (process != null)
                {
                    job.KillCollectTaskResultProcess();
                }
                return(false);
            }

            // 进程也没了,状态文件也不是完成,那还要分两种情况
            if (process == null)
            {
                if (collectTaskResultStatus.ErrCode == 2 || collectTaskResultStatus.ErrCode == 4)
                {
                    LogWriter.Write("找不到进程,状态为进行中或待执行,则回退到TaskSynced");
                    job.UpdateJobStatus(EnumJobRecordStatus.TaskSynced, cancellationToken);
                }
                else
                {
                    LogWriter.Write("找不到进程,状态为错误,则修改为TaskMergeFailed,需要调查");
                    job.UpdateJobStatus(EnumJobRecordStatus.TaskMergeFailed, cancellationToken);
                }

                return(false);
            }

            // 如果根据进程Id找到进程,则启动监控运行作业
            return(true);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <summary>
        /// 检查状态为执行中的任务,如果需要继续运行则返回true,否则返回false
        /// </summary>
        /// <returns><c>true</c>, if executing job task was checked, <c>false</c> otherwise.</returns>
        /// <param name="task">Task.</param>
        private bool CheckExecutingJobTask(JobTask task, CancellationToken cancellationToken = default(CancellationToken))
        {
            int processId = task.GetProcessId(cancellationToken);

            // 没有进程Id,则认为任务在启动进程前就挂掉了或者进程没有启动成功
            if (processId == -1)
            {
                LogWriter.Write("没有进程Id,任务在启动进程前就挂掉了或者进程没有启动成功,将更新任务状态为准备");
                task.UpdateTaskStatus(EnumTaskStatus.Pending, cancellationToken);
                return(false);
            }

            // 获取进程
            SwiftProcess.TryGetById(processId, task, out SwiftProcess process);

            // 如果任务执行状态文件标示已经执行完毕,则更新任务状态完成
            // 此时任务进程应该退出了,如果未退出可能是有未释放的资源,此时强行退出。
            var executeStatus = task.GetTaskExecuteStatus();

            if (executeStatus.ErrCode == 0)
            {
                LogWriter.Write("任务执行状态文件标示已经执行完毕,准备更新任务状态完成");

                task.UpdateTaskStatus(EnumTaskStatus.Completed, cancellationToken);

                if (process != null)
                {
                    task.KillProcess();
                }
                return(false);
            }

            // 任务执行状态文件未标示完成,进程又没了
            if (process == null)
            {
                LogWriter.Write("找不到进程,将更新任务状态为准备");
                task.UpdateTaskStatus(EnumTaskStatus.Pending, cancellationToken);
                return(false);
            }

            // 如果根据进程Id找到进程,则启动监控运行任务
            return(true);
        }