ASP.NET MVC5 實現基於Quartz.NET任務調度

 工做之餘。技術?。記是不可能記住的。 只有寫點東西 才能維持得了生活這樣子的。好早就像寫一篇關於任務調度的文章。終究是太懶了

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

好了。 該看看效果了 

因爲我的英語實在有限。 命名有誤 。請各位看官多多擔待  謝謝你們

相關文章
相關標籤/搜索