Quartz封装任务计划管理类

1、说明

本文为任务计划程序提供解决方案,倘若你需要程序机械式、定时性、周期性执行某项任务,本文兴许可以帮到你。

任务计划,采用Quartz、Cron表达式技术开发,如果对其中知识点不清楚的地方,可以自行查阅资料,本文将教会你如何快速实用他们,真的很简单,本文已经对实现类进行封装,你只需要写几行调用代码。

2、引入组件

Quartz.dll 唯一需要引入的组件,网上可以找到它

3、封装代码

①抽象类JobBase.cs

    /// <summary>
    /// 抽象类,之后所有job继承这个基类,实现run方法
    /// </summary>
    public abstract class JobBase
    {
        //抽象类,必须有一个抽象方法
        public abstract void Run(string FullFileName);
    }

②定义接口实例 JobInstance.cs,并实现IJob接口。

 / //@DisallowConcurrentExecution  //禁止并发多任务执行,所以永远只有一个任务在执行中
    public class JobInstance : IJob
    {
        /// <summary>
        /// 该类实现Ijob接口
        /// 从jobDataMap中取出JobBase实体,并执行Run方法
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task Execute(IJobExecutionContext context)
        {
            IDictionary<string, object> jobs = context.JobDetail.JobDataMap;
            if (jobs != null)
            {
                foreach (var item in jobs)
                {
                    return Task.Run(() =>
                    {
                        try
                        {
                            JobBase jobObj = item.Value as JobBase;//不在这里拆分
                            string l_strFilename = item.Key;
                            jobObj.Run(l_strFilename);
                        }
                        catch (Exception ex)
                        {
                            //throw Exception();
                            throw;
                        }
                    });
                }
            }
            return new Task(null);
        }
    }

③任务管理类JobManager.cs,负责任务的添加、删除、暂停、恢复,实际用于实用的就是该类中的方法。

 public class JobManager
    {
        IScheduler scheduler;
        public JobManager()
        {
            scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
            scheduler.Start();
        }

        /// <summary>
        /// 添加任务(传入时间间隔)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Second">时间间隔</param>
        public void AddJob<T>(int Second) where T : JobBase
        {
            JobBase jbobj = Activator.CreateInstance<T>();
            IDictionary<string, object> jobData = new Dictionary<string, object>();
            jobData.Add("name", jbobj);

            IJobDetail job1 = JobBuilder.Create<JobInstance>()
                .SetJobData(new JobDataMap(jobData)).Build();

            ITrigger trigger1 = TriggerBuilder.Create()
                .StartNow()
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(Second)
                .RepeatForever()).Build();

            scheduler.ScheduleJob(job1, trigger1);
        }

        /// <summary>
        /// 添加任务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filename">任务名</param>
        /// <param name="rule">执行时间策略</param>
        public void AddJob<T>(string filename, string rule) where T : JobBase
        {
            JobBase jbInstance = Activator.CreateInstance<T>();
            IDictionary<string, object> jobData = new Dictionary<string, object>();
            jobData.Add(filename, jbInstance);//键值对,存在key里可以找到文件名

            IJobDetail job1 = JobBuilder.Create<JobInstance>()
                  .SetJobData(new JobDataMap(jobData)).WithIdentity(filename).Build();//WithIdentity()指定任务名,用于其后关闭
            ITrigger trigger1 = TriggerBuilder.Create()
                .StartNow()
                .WithCronSchedule(rule).Build();

            scheduler.ScheduleJob(job1, trigger1);
        }

        /// <summary>
        /// 删除任务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jbname">任务名</param>
        public void DelJob<T>(string jbname)
        {
            JobKey jobKey = new JobKey(jbname);
            if (scheduler != null && scheduler.CheckExists(jobKey).Result)
            {
                scheduler.DeleteJob(jobKey);
            }
        }

        /// <summary>
        /// 暂停任务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jbname">任务名</param>
        public void PauseJob<T>(string jbname)
        {
            JobKey jobKey = new JobKey(jbname);
            if (scheduler != null && scheduler.CheckExists(jobKey).Result)
            {
                scheduler.PauseJob(jobKey);
            }
        }


        /// <summary>
        /// 恢复任务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jbname">任务名</param>
        public void ResumeJob<T>(string jbname)
        {
            JobKey jobKey = new JobKey(jbname);
            if (scheduler != null && scheduler.CheckExists(jobKey).Result)
            {
                scheduler.ResumeJob(jobKey);
            }
        }

④调用方式,案例

  JobManager job = new JobManager(); //实例化

job.AddJob<MediaJob>(l_strFilename, l_strRunStrategy);//添加任务

很简单吧,就这两行代码就可以实现定时任务的调用了。以下为调用方法实现,需要重写Run方法,打开视频播放。

public class MediaJob : JobBase
    {
        /// <summary>
        ///  设定的时间执行这个方法
        /// </summary>
        /// <param name="fileName"></param>
        public override void Run(string fileName)
        {
            LogHelper.Info("进入Run方法执行:" + fileName);

            ProcessExec processExec = new ProcessExec();
           
            string l_strFullFileName = Path.Combine(SysParameter.res_path, fileName);
            string l_strMess = "";
            processExec.p_PPTClose(null,null);
            LogHelper.Info("p_PPTClose()方法执行完毕:" + fileName);

            processExec.MediaStart(l_strFullFileName, out l_strMess);

            LogHelper.Info("MediaStart()方法执行完毕:" + fileName);

            if (l_strMess.Length>0)
            {
                DataOperation.UpdateLastResult(fileName,l_strMess);
                LogHelper.Info("UpdateLastResult()方法执行完毕:" + fileName);
            }
            else
            {
                DataOperation.UpdateLastResult(fileName, "成功");
                LogHelper.Info("UpdateLastResult()方法执行完毕:" + fileName);
            }
        }
    }

我也写了一个任务计划程序,运行效果如下图,需要源码的可以联系我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值