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


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

一、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

好了。 該看看效果了 

由於個人英語實在有限。 命名有誤 。請各位看官多多擔待  謝謝大家


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM