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