一、概述 1、quartz.net 是一款從java quartz 上延伸出來的定時任務框架。 2、我在網上看到很多大神寫過關於quartz.net 的博客、文章等,在這些博客文章里也學會了很多關於quartz的知識。今天博主也想寫一篇關於quartz的文章(不足之處望大神斧正),希望能幫助正在學習 ...
一、概述
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 }View Code
(3)打開視圖Index添加如下代碼
1 @using (Html.BeginForm("FirstQuartz", "Home", FormMethod.Post)) 2 { 3 <input type="submit" value="點擊開啟第一個定時任務"/> 4 }View Code
(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 }View Code
(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 }View Code
(5)到這裡我們的第一個簡單的quartz任務就搭建完成。
2、這裡只寫了開啟任務的方法,沒有寫關閉的方法,如果需要可以自由添加
(1)關閉方法為 _sched.Shutdown(),在開啟方法里最後註釋了,讀者可以單獨分離出來
四、測試
1、運行項目會看到 如下圖頁面
(1)點擊按鈕開啟任務
(2)打開本地磁碟e 你會看到一個文件夾QuartzLog裡面有一個日誌文件就是你的任務記錄 如圖
(3)我們可以看到任務是我們定義好的每五秒鐘執行一次
五、源碼及說明
1、源碼地址:http://git.oschina.net/yangguangchenjie/quartzmvc
2、如果喜歡我的文章請點關註O(∩_∩)O~~ ,有問題留言哦