欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC5 实现基于Quartz.NET任务调度

程序员文章站 2022-04-24 13:03:08
工作之余。技术?。记是不可能记住的。 只有写点东西 才能维持得了生活这样子的。好早就像写一篇关于任务调度的文章。终究是太懒了 一、Quartz.NET介绍 Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可 ......

 工作之余。技术?。记是不可能记住的。 只有写点东西 才能维持得了生活这样子的。好早就像写一篇关于任务调度的文章。终究是太懒了

一、Quartz.NET介绍

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

官网:http://www.quartz-scheduler.net/

源码:https://github.com/quartznet/quartznet

二、Quartz.NET用途

 一,可以定时发邮件通知。 

二 , 电商网站的定时打折活动。(比如规定11月11日 淘宝购买女朋友打八折)

三, 定时对数据更新 或者添加。

四,自己朋友生日。 可以定时发生日祝福。 等等 (我也不一一举例了) 

三、Quartz.NET安装

我使用的VS版本是2015的  选择工具  - NuGet包管理 - 管理解决方案的NuGet包   输入 Quartz.NET 安装

ASP.NET MVC5 实现基于Quartz.NET任务调度

 

还可以通过NuGet控制台 通过安装命令  

Install-Package Quartz

ASP.NET MVC5 实现基于Quartz.NET任务调度


四、Quartz.NET实现思路

一,继承并实现IJob接口,在Execute 方法中写你要做的事情(切记 )

二,使用Quartz 中的API 定义好 工作 触发器 以及工厂

三,加入可视化(远程管理) 

四,建立配置的通讯。

五,在全局类(Global.asax)Application_Start注册并开启定时任务

 

五、上代码

其中JobWork 是我的定义的工作文件  里面有你要执行的工作已经对应的触发器(一个工作对应一个触发器)

ASP.NET MVC5 实现基于Quartz.NET任务调度

首先 我写了一个向文本文件中插入文字的方法已经触发器 (注意 必须继承IJob  要做的事情写在 Execute 中)

 

  public class AddMassagejob : IJob
{ public void Execute(IJobExecutionContext context) { var reportDirectory = string.Format("~/text/{0}/", DateTime.Now.ToString("yyyy-MM-ssss")); reportDirectory = System.Web.Hosting.HostingEnvironment.MapPath(reportDirectory); if (!Directory.Exists(reportDirectory)) { Directory.CreateDirectory(reportDirectory); } var dailyReportFullPath = string.Format("{0}text_{1}.log", reportDirectory, DateTime.Now.Day); var logContent = string.Format("{0}-{1}-{2}", DateTime.Now, "滴 滴滴", Environment.NewLine); if (logContent == null) { JobExecutionException jobex = new JobExecutionException("写入失败");
} File.AppendAllText(dailyReportFullPath, logContent); } }
 public class AddMasagerTriggerServer
    {

        public ITrigger AddMasagerTrigger()
        {
            var trigger = TriggerBuilder.Create()
                .WithIdentity("添加消息到日志", "作业触发器")
                .WithSimpleSchedule(x => x
                    //.WithIntervalInSeconds(5)
                    // .WithIntervalInHours(5)
                    .WithIntervalInMinutes(5) //每五分钟执行一次
                    .RepeatForever())
                .Build();
            return trigger;
        }
    }

我这里设置的是5分钟执行一次。 你也可以让他5秒 5小时执行一次。

关于时间配置

官方一些常用的实例 

0 0 12 * * ? 每天12点触发 
0 15 10 ? * * 每天10点15分触发 
0 15 10 * * ? 每天10点15分触发 
0 15 10 * * ? * 每天10点15分触发 
0 15 10 * * ? 2005 2005年每天10点15分触发 
0 * 14 * * ? 每天下午的 2点到2点59分每分触发 
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 
0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 
每天下午的 18点到18点59分(整点开始,每隔5分触发) 
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发 
0 10,44 14 ? 3 WED     3月分每周三下午的 2点10分和2点44分触发 (特殊情况,在一个时间设置里,执行两次或                                                             两次以上的情况) 
0 59 2 ? * FRI    每周5凌晨2点59分触发; 
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发 
0 15 10 15 * ? 每月15号上午10点15分触发 
0 15 10 L * ? 每月最后一天的10点15分触发 
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发 
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发 
0 15 10 ? * 6#3 每月的第三周的星期五开始触发 
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次 
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

有兴趣的朋友可以了解 具体含义规范

 

然后就是创建一个作业 这里我用的是泛型去创建

 public class JobServer<T> where T : IJob
    {
        public string JobName { get; set; }
        public string JobGroup { get; set; }

        public IJobDetail CrateJob()
        {
            IJobDetail job1 = JobBuilder.Create<T>() //创建一个作业
                .WithIdentity(JobName, JobGroup) //JobName  代表你要执行的这个任务的名称。 JobGroup任务分组
                .Build();

            return job1;
        }

    }

接下来就是一些 Quartz 的配置(线程配置 远程配置等) 当然 你也可以选择写在配置文件 或者XML文件中

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"] = "1996";  //配置端口号
                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>(JobServer<T> jobServer,ITrigger trigger, string jobName, string jobGroup) where T : IJob
        {
            jobServer.JobName = jobName;
            jobServer.JobGroup = jobGroup;
            Scheduler.ScheduleJob(jobServer.CrateJob(), trigger);
} }
 绑定trigger和job

然后就工作层  也就是任务的声明调用处 

 public class JobManager
    {
        public static void State()
        {
            //开启调度
            JobBase.Scheduler.Start();

            // 第一个参数是你要执行的工作(job)  第二个参数是这个工作所对应的触发器(Trigger)(例如:几秒或几分钟执行一次)
            JobBase.AddSchedule(new JobServer<AddMassagejob>(),  
                new AddMasagerTriggerServer().AddMasagerTrigger(),"每隔五分钟向文本中写入文字","消息工作");

            JobBase.AddSchedule(new JobServer<DiscountedShopJob>(), 
                new DiscountedShopTriggerServer().GoodsDisCountTrigger(),"每月的最后一天10.15开启打折活动","折扣活动");
        }
    }

在全局类中加入下面代码  开启工作

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            JobManager.State();
        }
    }

 

代码部分已经完成了 接下来就是如何使用 

首先 安装一个远程管理  也就是可视化操作  (你不需要写任何代码)

安装步骤一样。  

  在控制台 执安装命令

  PM> Install-Package CrystalQuartz.Remote

 

安装之后你会在web.config 中发现这样的代码

ASP.NET MVC5 实现基于Quartz.NET任务调度

其中下方红色框起来的部分   其中SchedulerHost 对应的端口号和远程名称 都要对应上方代码中配置。  一旦保持一致  意味着达成了通讯。共通了 

ASP.NET MVC5 实现基于Quartz.NET任务调度

然后启动项目在路由加上/CrystalQuartzPanel.axd

好了。 该看看效果了 

ASP.NET MVC5 实现基于Quartz.NET任务调度

由于个人英语实在有限。 命名有误 。请各位看官多多担待  谢谢大家