工作之餘。技術?。記是不可能記住的。 只有寫點東西 才能維持得了生活這樣子的。好早就像寫一篇關於任務調度的文章。終究是太懶了 一、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 安裝
還可以通過NuGet控制台 通過安裝命令
Install-Package Quartz
四、Quartz.NET實現思路
一,繼承並實現IJob介面,在Execute 方法中寫你要做的事情(切記 )
二,使用Quartz 中的API 定義好 工作 觸發器 以及工廠
三,加入可視化(遠程管理)
四,建立配置的通訊。
五,在全局類(Global.asax)Application_Start註冊並開啟定時任務
五、上代碼
其中JobWork 是我的定義的工作文件 裡面有你要執行的工作已經對應的觸發器(一個工作對應一個觸發器)
首先 我寫了一個向文本文件中插入文字的方法已經觸發器 (註意 必須繼承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 中發現這樣的代碼
其中下方紅色框起來的部分 其中SchedulerHost 對應的埠號和遠程名稱 都要對應上方代碼中配置。 一旦保持一致 意味著達成了通訊。共通了
然後啟動項目在路由加上/CrystalQuartzPanel.axd
好了。 該看看效果了
由於個人英語實在有限。 命名有誤 。請各位看官多多擔待 謝謝大家