Quartz封装任务计划管理类

1、说明

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

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

2、引入组件

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

3、封装代码

①抽象类JobBase.cs

    ///


    /// 抽象类,之后所有job继承这个基类,实现run方法
    ///

    public abstract class JobBase
    {
        //抽象类,必须有一个抽象方法
        public abstract void Run(string FullFileName);
    }

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

 / //@DisallowConcurrentExecution  //禁止并发多任务执行,所以永远只有一个任务在执行中
    public class JobInstance : IJob
    {
        ///


        /// 该类实现Ijob接口
        /// 从jobDataMap中取出JobBase实体,并执行Run方法
        ///

        ///
        ///
        public Task Execute(IJobExecutionContext context)
        {
            IDictionary 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();
        }

        ///


        /// 添加任务(传入时间间隔)
        ///

        ///
        /// 时间间隔
        public void AddJob(int Second) where T : JobBase
        {
            JobBase jbobj = Activator.CreateInstance();
            IDictionary jobData = new Dictionary();
            jobData.Add("name", jbobj);

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

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

            scheduler.ScheduleJob(job1, trigger1);
        }

        ///


        /// 添加任务
        ///

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

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

            scheduler.ScheduleJob(job1, trigger1);
        }

        ///


        /// 删除任务
        ///

        ///
        /// 任务名
        public void DelJob(string jbname)
        {
            JobKey jobKey = new JobKey(jbname);
            if (scheduler != null && scheduler.CheckExists(jobKey).Result)
            {
                scheduler.DeleteJob(jobKey);
            }
        }

        ///


        /// 暂停任务
        ///

        ///
        /// 任务名
        public void PauseJob(string jbname)
        {
            JobKey jobKey = new JobKey(jbname);
            if (scheduler != null && scheduler.CheckExists(jobKey).Result)
            {
                scheduler.PauseJob(jobKey);
            }
        }


        ///


        /// 恢复任务
        ///

        ///
        /// 任务名
        public void ResumeJob(string jbname)
        {
            JobKey jobKey = new JobKey(jbname);
            if (scheduler != null && scheduler.CheckExists(jobKey).Result)
            {
                scheduler.ResumeJob(jobKey);
            }
        }

④调用方式,案例

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

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

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

public class MediaJob : JobBase
    {
        ///


        ///  设定的时间执行这个方法
        ///

        ///
        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);
            }
        }
    }

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

Quartz封装任务计划管理类_第1张图片

Quartz封装任务计划管理类_第2张图片

Quartz封装任务计划管理类_第3张图片

你可能感兴趣的:(C#项目,任务计划,数据库,Quartz)