Quartz.net 定时任务之简单任务
一、概述
1、quartz.net 是一款从java quartz 上延伸出来的定时任务框架。
2、我在网上看到很多大神写过关于quartz.net 的博客、文章等,在这些博客文章里也学会了很多关于quartz的知识。今天博主也想写一篇关于quartz的文章(不足之处望大神斧正),希望能帮助正在学习quartz路上的兄弟姐妹,顺便也巩固自己。
3、quartz这篇博客会从最基础的开始,之后会逐渐的升级,如果有喜欢的兄弟姐妹,请关注我的博客,博主会持续更新
二、搭建
1、打开vs创建新的mvc空项目,取名:QuartzMVC 如图
2、完成上一步,接下来我们安装quart
(1)打开vs 工具-->库程序包管理器-->程序包管理台 打开程序包管理台之后 输入
(2)安装成功之后,你会看见项目里多了一个 job_scheduling_data_2_0.xsd文件(无需理会)
3、同第2步,我们相继安装 log4net.dll 、 Common.Logging.dll 、Common.Logging.Core.dll 3个日志工具
(1)安装好如下图
4、配置web.config,添加日志输出路径 如图
三、代码
1、添加一个控制器取名Home
(1)在Home控制器里添加一个视图Index
(2)在QuartzMVC项目下建立日志工具类 取名:LogTool 并编写如下代码
1 public static void DetailLogRecord(string type, LogTool.FolderCreationType folderCrationType, string content, bool isErasable, string filename = null) 2 { 3 string folderPrefixPath = (System.Configuration.ConfigurationManager.AppSettings["localLogPath"] ?? "c:\\test_log_tem") + "\\" + type; 4 string folderPath = ""; 5 try 6 { 7 switch (folderCrationType) 8 { 9 default: folderPath = folderPrefixPath; break; 10 } 11 if (!Directory.Exists(folderPath)) 12 { 13 Directory.CreateDirectory(folderPath); 14 } 15 string filePath = folderPath + "\\" + (filename ?? DateTime.Now.ToString("yyyyMMdd")) + ".log"; 16 content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " :\r\n" + content + "\r\n"; 17 if (isErasable) LogTool.RecordNewFileLog(filePath, content); 18 else LogTool.RecordConsecutiveLog(filePath, content); 19 } 20 catch 21 { 22 throw; 23 } 24 25 } 26 27 28 public enum FolderCreationType 29 { 30 None 31 } 32 33 private static void RecordConsecutiveLog(string filePhysicalUrl, string pursuitContent) 34 { 35 System.IO.FileStream fs = new System.IO.FileStream(filePhysicalUrl, FileMode.OpenOrCreate, FileAccess.Write); 36 System.IO.StreamWriter m_streamWriter = new System.IO.StreamWriter(fs); 37 m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 38 39 string resultStr = Environment.NewLine + pursuitContent; 40 41 m_streamWriter.WriteLine(resultStr); 42 m_streamWriter.Flush(); 43 m_streamWriter.Close(); 44 fs.Close(); 45 } 46 47 private static void RecordNewFileLog(string filePhysicalUrl, string content) 48 { 49 System.IO.StreamWriter sw = new System.IO.StreamWriter(filePhysicalUrl); 50 sw.WriteLine(content); 51 sw.Close(); 52 } 53 54 private static void CreateFolder(string url) 55 { 56 if (Directory.Exists((url)) == false) 57 { 58 Directory.CreateDirectory((url)); 59 } 60 }
(3)打开视图Index添加如下代码
1 @using (Html.BeginForm("FirstQuartz", "Home", FormMethod.Post)) 2 { 3 <input type="submit" value="点击开启第一个定时任务"/> 4 }
(4)在QuartzMVC项目下的Model 文件夹下建立JobClass类并继承IJob接口 代码如下
1 public class JobClass:IJob 2 { 3 //日志 4 private static ILog _log = LogManager.GetLogger(typeof(JobClass)); 5 6 /// <summary> 7 /// 构造方法 8 /// </summary> 9 public JobClass() 10 { } 11 /// <summary> 12 /// 作业默认接口 13 /// </summary> 14 /// <param name="context"></param> 15 public void Execute(IJobExecutionContext context) 16 { 17 LogTool.DetailLogRecord("a", LogTool.FolderCreationType.None, "我的第一个任务", false); 18 } 19 }
(5)打开Home控制器添加方法“FirstQuartz”如下代码
1 public void FirstQuartz() 2 { 3 StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(); 4 //得到调度 5 IScheduler sched = schedulerFactory.GetScheduler(); 6 //构造一个调度工厂 7 LogTool.DetailLogRecord("a", LogTool.FolderCreationType.None, "创建调度器成功", false); 8 sched.Start(); 9 10 IJobDetail job = JobBuilder.Create<JobClass>() 11 .WithIdentity("作业名称", "作业分组") 12 .Build(); 13 // 触发作业 14 ITrigger trigger = TriggerBuilder.Create() 15 16 #region 使用 时间间隔 先不介绍 17 //.WithIdentity("myTrigger", "group1") 18 //.StartNow() 19 //.WithSimpleSchedule(x => x 20 // .WithIntervalInSeconds(5) 21 // .RepeatForever()) 22 //.Build(); 23 #endregion 24 25 #region 使用cron 规则 26 27 .WithIdentity("触发器名称", "触发器分组") 28 .WithCronSchedule("/5 * * ? * *") // 每隔五秒执行一次 这个表达式我们将在下一篇介绍 29 .StartAt(DateTime.UtcNow) 30 .WithPriority(1) 31 .Build(); 32 #endregion 33 // 将作业和触发器添加到调度器 34 sched.ScheduleJob(job, trigger); 35 36 // 2天后关闭作业调度 定时关闭任务实例 37 //Thread.Sleep(TimeSpan.FromDays(2)); 38 39 // _sched.Shutdown(); // 结束 40 }
(5)到这里我们的第一个简单的quartz任务就搭建完成。
2、这里只写了开启任务的方法,没有写关闭的方法,如果需要可以自由添加
(1)关闭方法为 _sched.Shutdown(),在开启方法里最后注释了,读者可以单独分离出来
四、测试
1、运行项目会看到 如下图页面
(1)点击按钮开启任务
(2)打开本地磁盘e 你会看到一个文件夹QuartzLog里面有一个日志文件就是你的任务记录 如图
(3)我们可以看到任务是我们定义好的每五秒钟执行一次
五、源码及说明
1、注:有事请留言,要源码请加qq群:460362190
2、如果喜欢我的文章请点关注O(∩_∩)O~~ ,有问题留言哦