工做之餘。技術?。記是不可能記住的。 只有寫點東西 才能維持得了生活這樣子的。好早就像寫一篇關於任務調度的文章。終究是太懶了
1、Quartz.NET介紹
Quartz.NET是一個強大、開源、輕量的做業調度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改寫,可用於winform和asp.net應用中。它靈活而不復雜。你可以用它來爲執行一個做業而建立簡單的或複雜的做業調度。它有不少特徵,如:數據庫支持,集羣,插件,支持cron-like表達式等等。html
官網:http://www.quartz-scheduler.net/git
源碼:https://github.com/quartznet/quartznetgithub
2、Quartz.NET用途
一,能夠定時發郵件通知。 web
二 , 電商網站的定時打折活動。(好比規定11月11日 淘寶購買女友打八折)數據庫
三, 定時對數據更新 或者添加。框架
四,本身朋友生日。 能夠定時發生日祝福。 等等 (我也不一一舉例了) asp.net
3、Quartz.NET安裝
我使用的VS版本是2015的 選擇工具 - NuGet包管理 - 管理解決方案的NuGet包 輸入 Quartz.NET 安裝tcp
還能夠經過NuGet控制檯 經過安裝命令 工具
Install-Package Quartz
4、Quartz.NET實現思路
一,繼承並實現IJob接口,在Execute 方法中寫你要作的事情(切記 )post
二,使用Quartz 中的API 定義好 工做 觸發器 以及工廠
三,加入可視化(遠程管理)
四,創建配置的通信。
五,在全局類(Global.asax)Application_Start註冊並開啓定時任務
5、上代碼
其中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
好了。 該看看效果了
因爲我的英語實在有限。 命名有誤 。請各位看官多多擔待 謝謝你們