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

来源:https://www.cnblogs.com/zixuan9527/archive/2018/03/19/8601151.html
-Advertisement-
Play Games

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

好了。 該看看效果了 

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Make a simple custom EventEmitter ...
  • 1,abs 求絕對值 2,max, min求序列最大值與最小值 3,len求列表的長度 4,divmod求商和餘數 5,pow,兩個值,冪運算,3個值,先冪運算,再除以第三個值,求餘數 6,callable測試函數是否可以被調用 7,類型判斷 也可以用isinstance判斷 8,cmp比較字元串大 ...
  • 單例模式 單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。 比如,某個伺服器程式的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文 ...
  • 因Excel催化劑用了VSTO的開發技術,並且為了最好的用戶體驗,用了Clickonce的佈署方式(無需人工干預自動更新,讓用戶使用如瀏覽器訪問網站一般,永遠是最新的內容和功能)。對安裝過程有一定的難度要求。僅以此文簡單羅列一下,希望能夠給廣大用戶一些實質性的指引(安裝成功過Excel催化劑插件或安 ...
  • 在使用騰訊雲對象存儲之前,公司一直使用的是傳統的FTP的上傳模式,而隨著用戶量的不斷增加,FTP所暴露出來的問題也越來越多,1.傳輸效率低,上傳速度慢。2.時常有上傳其他文件來攻擊伺服器,安全上得不到保障。所以我們在經過慎重考慮覺得使用第三方的雲存儲服務。 在最開始的時候我們在騰訊雲與阿裡雲中選擇, ...
  • 去年12月份,隨著Visual Studio 2017 Update 15.5的發佈,Visual C#迎來了它的最新版本:7.2. 在這個版本中,有個讓人難以理解的新特性,就是private protected訪問修飾符(Access Modifier)。至此,C#語言的訪問修飾符有以下幾種: p ...
  • 本文來告訴大家在C#很少有人會發現的科技。即使是工作了好多年的老司機也不一定會知道,如果覺得我在騙你,那麼請看看下麵 ...
  • 提到 UWP 中創建動畫,第一個想到的大多都是 StoryBoard。因為 UWP 和 WPF 的界面都是基於 XAML 語言的,所以實現 StoryBoard 會非常方便。 來看一個簡單的 StoryBoard 例子: 這是一個很典型也很簡單的 StoryBoard 實現,相信做過 WPF 或 U ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...