/// <summary> /// 停止一个任务 /// </summary> /// <param name="taskId"></param> /// <param name="callBack"></param> /// <returns></returns> public static bool Stop(Guid taskId) { try { JobKey jk = new JobKey(taskId.ToString().ToLower()); var job = _scheduler.GetJobDetail(jk); if (job != null) { var instance = job.JobDataMap["instance"] as TaskBase; //释放资源 if (instance != null) { instance.Dispose(); } //卸载应用程序域 var domain = job.JobDataMap["domain"] as AppDomain; AssemblyHelper.UnLoadAppDomain(domain); //删除quartz有关设置 var trigger = new TriggerKey(taskId.ToString()); _scheduler.PauseTrigger(trigger); _scheduler.UnscheduleJob(trigger); _scheduler.DeleteJob(jk); _scheduler.ListenerManager.RemoveJobListener(taskId.ToString()); } LogHelper.Info($"任务已经停止运行!", taskId); return(true); } catch (Exception exp) { LogHelper.Error($"任务停止失败!", exp, taskId); return(false); } }
/// <summary> /// 启动一个任务,带重试机制 /// </summary> /// <param name="task"></param> /// <param name="callBack"></param> /// <returns></returns> public static bool StartWithRetry(Task task) { AppDomain ad = null; try { //这里用AppDomain解决程序集引用依赖的问题 ad = AssemblyHelper.LoadAppDomain(task.AssemblyName); for (int i = 0; i < 3; i++) { try { Start(task, ad); return(true); } catch (SchedulerException sexp) { LogHelper.Error($"任务启动失败!开始第{i + 1}次重试...", sexp, task.Id); } } //最后一次尝试 Start(task, ad); return(true); } catch (SchedulerException sexp) { AssemblyHelper.UnLoadAppDomain(ad); LogHelper.Error($"任务所有重试都失败了,已放弃启动!", sexp, task.Id); return(false); } catch (Exception exp) { AssemblyHelper.UnLoadAppDomain(ad); LogHelper.Error($"任务启动失败!", exp, task.Id); return(false); } }