.net core中Quartz的使用

来源:https://www.cnblogs.com/dangzhensheng/archive/2019/03/08/10496278.html
-Advertisement-
Play Games

原來工作中有用到定時任務Quartz,不過是在MVC項目中,現在net core項目中也要用到,就開始改版。中間發現在網上的教程只有執行定時計劃的過程,卻很少有人寫註冊的過程,覺得有點略坑。所以寫此文章一是自己做個記錄,二是希望能幫助到其他人。後面還把此功能做出了多任務定時執行,網上關於net co ...


原來工作中有用到定時任務Quartz,不過是在MVC項目中,現在net core項目中也要用到,就開始改版。中間發現在網上的教程只有執行定時計劃的過程,卻很少有人寫註冊的過程,覺得有點略坑。所以寫此文章一是自己做個記錄,二是希望能幫助到其他人。後面還把此功能做出了多任務定時執行,網上關於net core的教程更是少了,花費了不少時間實現了出來。

Quartz版本:3.0.7

1.NuGet中下載安裝Quartz

2.新建Quartz幫助類

 (1)新建QuartzJob類,代碼如下:

public class QuartzJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            var jobKey = context.JobDetail.Key;//獲取job信息
            var triggerKey = context.Trigger.Key;//獲取trigger信息

            LogHelper.Info($"{DateTime.Now} QuartzJob:==>>自動執行.{jobKey.Name}|{triggerKey.Name}");
            await Task.CompletedTask;
        }
    }

  ps: 上面代碼中的jobKey和triggerKey可獲取到自己定義的job和trigger的信息,這樣做多任務時可區分要執行的是哪個任務. 另LogHelper.Info是自己封裝好的日子記錄類,可替換為自己的日誌類

(2)新建QuartzFactory類,代碼如下: 

public class QuartzFactory : IJobFactory
    {
        private readonly IServiceProvider _serviceProvider;

        public QuartzFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            var jobDetail = bundle.JobDetail;

            var job = (IJob)_serviceProvider.GetService(jobDetail.JobType);
            return job;
        }

        public void ReturnJob(IJob job)
        {
        }
    }

 (3)新建QuartzService類,代碼如下:

#region 單任務
        public static void StartJob<TJob>() where TJob : IJob
        {
            var scheduler = new StdSchedulerFactory().GetScheduler().Result;

            var job = JobBuilder.Create<TJob>()
                .WithIdentity("job")
                .Build();

            var trigger1 = TriggerBuilder.Create()
                .WithIdentity("job.trigger")
                .StartNow()
                .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
                .ForJob(job)
                .Build();

            scheduler.AddJob(job, true);
            scheduler.ScheduleJob(job, trigger1);
            scheduler.Start();
        }
        #endregion

        #region 多任務
        public static void StartJobs<TJob>() where TJob : IJob
        {
            var scheduler = new StdSchedulerFactory().GetScheduler().Result;

            var job = JobBuilder.Create<TJob>()
                .WithIdentity("jobs")
                .Build();

            var trigger1 = TriggerBuilder.Create()
                .WithIdentity("job.trigger1")
                .StartNow()
                .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
                .ForJob(job)
                .Build();

            var trigger2 = TriggerBuilder.Create()
                .WithIdentity("job.trigger2")
                .StartNow()
                .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(11)).RepeatForever())
                .ForJob(job)
                .Build();

            var dictionary = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>
            {
                {job, new HashSet<ITrigger> {trigger1, trigger2}}
            };
            scheduler.ScheduleJobs(dictionary, true);
            scheduler.Start();
        }
        #endregion

        #region 配置
        public static void AddQuartz(this IServiceCollection services, params Type[] jobs)
        {
            services.AddSingleton<IJobFactory, QuartzFactory>();
            services.Add(jobs.Select(jobType => new ServiceDescriptor(jobType, jobType, ServiceLifetime.Singleton)));

            services.AddSingleton(provider =>
            {
                var schedulerFactory = new StdSchedulerFactory();
                var scheduler = schedulerFactory.GetScheduler().Result;
                scheduler.JobFactory = provider.GetService<IJobFactory>();
                scheduler.Start();
                return scheduler;
            });
        }
        #endregion

3.在Startup.cs中註冊代碼

public void ConfigureServices(IServiceCollection services)
{
            services.AddQuartz(typeof(QuartzJob));
//........ } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { QuartzService.StartJobs<QuartzJob>(); //........ }

 ps: 因AddQuartz方法定義的是Type[]類型,所以可傳多個執行類,如:services.AddQuartz(typeof(QuartzJob1), typeof(QuartzJob2)); 不過這樣做StartJob()方法就得另處理下,這裡就略過

 

OK,大功告成,這個東西折騰了兩天終於塵埃落定了,執行結果如下:

 


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

-Advertisement-
Play Games
更多相關文章
  • 減壓閥(Reducing Valve)是通過調節,將進口壓力減至某一需要的出口壓力,並依靠介質本身的能量,使出口壓力自動保持穩定的閥門。從流體力學的觀點看,減壓閥是一個局部阻力可以變化的節流元件,即通過改變節流面積,使流速及流體的動能改變,造成不同的壓力損失,從而達到減壓的目的。 ...
  • 電磁閥(Solenoid Valve)由電磁線圈跟直通或多通閥組合使用,可分常開常閉兩種,通過AC220V或DC24電源控制開關或切換介質流動方向,是用來控制流體的自動化基礎元件,電磁閥選型首先應該依次遵循安全性,可靠性,適用性,經濟性四大原則。 ...
  • 調節閥(Control Valve)又名控制閥,在工業自動化過程式控制制領域中,通過接受調節控制單元輸出的控制信號,藉助動力操作去改變介質流量、壓力、溫度、液位等工藝參數的最終控制元件。一般由執行機構和閥門組成,可以分為氣動調節閥、電動調節閥、自力式調節閥。 ...
  • 止回閥(Check Valve)是指依靠介質本身流動而自動開、閉閥瓣,用來防止介質倒流的閥門,又稱逆止閥、單向閥、逆流閥、和背壓閥。止回閥屬於一種自動閥門,其主要作用是防止介質倒流、防止泵及驅動電動機反轉,以及容器介質的泄放。 ...
  • 蝶閥(Butterfly Valve)啟閉件是蝶板,由閥桿帶動,在閥體內繞其自身的軸線旋轉90°,從而達到啟閉或調節的目的。在管路中主要用來做切斷介質,結構簡單,操作靈活,開關迅速,尺寸小,結構短,阻力小,重量輕等特點。 ...
  • 今天第一次上來博客園寫寫東西,之前在頭條喜歡寫一些雜七雜八的東西,但後來發現頭條是一個魚龍混雜的地方,什麼新聞都有,要說發表技術的文章估計沒有多少人看。畢竟在博客園大部分搜索的人都是一些有著相同夢想和需求的人,希望在這裡可以認識更多大牛,也更希望我的分享可以給大家帶來幫助,我今後會寫一些關於自己學習 ...
  • @[TOC] 使用ASP.NET Core2.2創建WebApp 前言 官方用的是WebApp這個詞,而我還是更喜歡稱做“網站”,也許含義很不一樣吧,至少我認為是一樣的,求賜教! 使用dotnet命令new一個WebApp 創建WebApp至少有兩種途徑: 1. 宇宙最強Visual Studio; ...
  • 介面篇 模塊篇 敬請期待...... 領域篇 敬請期待...... 消息篇 敬請期待...... 緩存篇 敬請期待...... 任務調度篇 敬請期待...... 認證篇 敬請期待...... 倉儲篇 敬請期待...... 配置篇 敬請期待...... Castle.Windsor篇 敬請期待.... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...