mvc配合Quartz完成定时作业

Quartz.NET

是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

 

Quartz他的作用比如:定时发邮件,定时记录日志。。。。等等

Quartz安装  NuGet-------Quartz 和CrystalQuartz.Remote(这个是一个远程管理  也就是可视化操作)

quuartz实现过程:

1:要定时完成的事情    继承并实现IJob接口    Execute 方法中写你要做的事情

我这里是定时记录日志信息

 /// <summary>
    /// 要执行的任务
    /// </summary>
    public class AddLog : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            LogManager.GetLogger("info").Info("Quartz定时任务测试");
        }
    }
View Code

2.定义好触发器,如:每周五下午3点记录一条日志。。。

我这里是测试,每五秒记录一条

 /// <summary>
    /// 任务触发器
    /// 一个人任务对应一个触发器
    /// </summary>
    public class AddLogTrigger
    {
        public ITrigger addLogTrigger()
        {
            var Trigger = TriggerBuilder.Create().WithIdentity("添加日志", "触发器").WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()).Build();
            return Trigger;
        }
    }
View Code

3.顶一个创建作业的方法

/// <summary>
    /// 创建作业
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class JobCreate<T> where T : IJob
    {
        public string JobName { get; set; }
        public string JobGroup { get; set; }
        public IJobDetail CrateJob()
        {
            ////创建一个作业,JobName  代表你要执行的这个任务的名称。 JobGroup任务分组
            IJobDetail job1 = JobBuilder.Create<T>().WithIdentity(JobName, JobGroup).Build();
            return job1;
        }
    }
View Code

4.定义好Quartz的线程配置,远程配置等。以及绑定Job和Trigger的方法

 /// <summary>
    /// Quartz 的配置
    /// 线程配置 远程配置等
    /// </summary>
    public class JobBase
    {
        public static IScheduler Scheduler
        {
            get 
            {
                var properties = new NameValueCollection();
                // 设置线程池
                properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
                //设置线程池的最大线程数量
                properties["quartz.threadPool.threadCount"] = "5";
                //设置作业中每个线程的优先级
                properties["quartz.threadPool.threadPriority"] = ThreadPriority.Normal.ToString();

                // 远程输出配置
                properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
                properties["quartz.scheduler.exporter.port"] = "2001";  //配置端口号
                properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
                properties["quartz.scheduler.exporter.channelType"] = "tcp"; //协议类型

                //创建一个工厂
                var schedulerFactory = new StdSchedulerFactory(properties);
                //启动
                var scheduler = schedulerFactory.GetScheduler();
                return scheduler;
            }
        }
        public static void AddSchedule<T>(JobCreate<T> jobServer, ITrigger trigger, string jobName, string jobGroup) where T : IJob
        {
            //绑定trigger和job
            jobServer.JobName = jobName;
            jobServer.JobGroup = jobGroup;
            Scheduler.ScheduleJob(jobServer.CrateJob(), trigger);
        }
    }

5.定义一个方法来启动调度和绑定作业和触发器

  public class Job
    {
        public static void State()
        {
            //开启调度
            JobBase.Scheduler.Start();
            // 第一个参数是你要执行的工作(job)  第二个参数是这个工作所对应的触发器(Trigger)(例如:几秒或几分钟执行一次)
            JobBase.AddSchedule(new JobCreate<AddLog>(), new AddLogTrigger().addLogTrigger(), "每五秒钟添加一个测试日志", "消息");
        }
    }

然后在网站全局配置文件Global.asax

下的Application_Start注册并开启定时任务   Job.State();

可视化操作:

安装完CrystalQuartz.Remote  在web.config下会多两句配置文件

SchedulerHost 对应的端口号和远程名称 都要对应上方代码中配置的端口号和名称            PS:这里的端口号不要和IIS中项目的端口号一致,否则冲突。

然后启动项目    地址栏加上/CrystalQuartzPanel.axd 

然后看一下我们的日志是否记录了

 

OK

 

posted @ 2021-06-20 12:08  raccon2001  阅读(199)  评论(0)    收藏  举报