Пример #1
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
            }
        }