08_Quartz.NET使用

Quartz.NET 是一個用於調度任務和作業的開源框架,它允許開發人員創建簡單或複雜的調度方案,例如定時執行任務,定時觸發作業等。

創建調度器很簡單需要三個對象:  IScheduler、IJob、ITrigger,直接上代碼,使用可根據需求再擴展

using Quartz;
using Quartz.Impl;
using QuartzScheduler.Job;
using QuartzScheduler.Listener;

namespace QuartzScheduler
{
    /// <summary>
    /// 調度器
    /// </summary>
    public class MyScheduler
    {
        /// <summary>
        /// 創建調度器
        /// </summary>
        public async static Task SchedulerAction()
        {
            //IScheduler
            StdSchedulerFactory stdScheduler = new StdSchedulerFactory();
            IScheduler scheduler = await stdScheduler.GetScheduler();
            await scheduler.Start();

            //添加監聽器
            scheduler.ListenerManager.AddJobListener(new JobListener());//Job監聽器
            scheduler.ListenerManager.AddTriggerListener(new TriggerListener());//Trigger監聽器
            scheduler.ListenerManager.AddSchedulerListener(new SchedulerListener());//Scheduler監聽器

            //IJob
            IJobDetail jobDetail = JobBuilder.Create<QuartzJobDemo01>()
                .WithIdentity("JobName", "Group01")                                       //唯一標識
                .WithDescription("這裏是描述......")                                      //信息描述
                .StoreDurably(true)                                                       //孤立存儲
                .RequestRecovery(true)                                                    //請求恢復,指應用崩潰後再次啓動,會重新執行該作業
                .Build();

            //IJob設置參數
            jobDetail.JobDataMap.Add("UserName1", "張三");
            jobDetail.JobDataMap.Add("Weight", 100);
            jobDetail.JobDataMap.Add("time", DateTime.Now);


            //ITrigger
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("TriggerName", "Group01")
                //.StartAt(new DateTimeOffset())                 //從某時間段開始執行
                //.StartNow()                                  //從現在開始

                //鏈式策略
                //.WithSimpleSchedule(p =>
                //{
                //    p.WithIntervalInSeconds(5)        //5秒執行一次,(WithIntervalInHours小時,WithIntervalInMinutes分鐘)
                //    //.WithRepeatCount(3)             //執行3次
                //    .RepeatForever();                 //一直執行      

                //正則表達式策略
                .WithCronSchedule("0/5 * * * * ? ")    //每5秒執行一次:https://cron.ciding.cc/在線正則解析
                .Build();

            // ITrigger設置參數
            trigger.JobDataMap.Add("Age", 18);


            //添加調度
            await scheduler.ScheduleJob(jobDetail, trigger);


        }
    }
}

 

QuartzJobDemo01.cs

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzScheduler.Job
{
    /// <summary>
    /// 任務01
    /// </summary>
    [PersistJobDataAfterExecution]//執行後保留作業數據
    [DisallowConcurrentExecution]//確保上次執行完成後才能執行這次
    public class QuartzJobDemo01 : IJob
    {
        public QuartzJobDemo01()
        {
            Console.WriteLine("--QuartzJobDemo01被構造了-");
        }

        public async Task Execute(IJobExecutionContext context)
        {
            await Task.Factory.StartNew(() =>
            {
                string? username01= context.JobDetail.JobDataMap.GetString("UserName1"); 
                int? weight = context.JobDetail.JobDataMap.GetInt("Weight");
                string? time = context.JobDetail.JobDataMap.GetDateTime("time").ToString();
                int? age = context.Trigger.JobDataMap.GetInt("Age");
                Console.WriteLine("--------------------------------------");
                Console.WriteLine($"Hello,這是QuartzJobDemo01...........");
                Console.WriteLine($"傳過來的參數UserName01:{username01}");
                Console.WriteLine($"傳過來的參數Weight:{weight}");
                Console.WriteLine($"傳過來的參數time:{time}");
                Console.WriteLine($"傳過來的參數Age:{age}");

                context.JobDetail.JobDataMap.Put("Weight", weight + 1);//保留作業數據測試
                Console.WriteLine("--------------------------------------");
            });
        }
    }
}

 

JobListener.cs

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzScheduler.Listener
{
    /// <summary>
    /// Job監聽器
    /// </summary>
    public class JobListener : IJobListener
    {
        public string Name => "JobListener的名稱";

        /// <summary>
        /// 任務中斷後執行
        /// </summary>
        /// <param name="context"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine("任務中斷後執行..........."));
        }

        /// <summary>
        /// 執行前觸發
        /// </summary>
        /// <param name="context"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine("執行前觸發..........."));
        }

        /// <summary>
        /// 執行後會觸發
        /// </summary>
        /// <param name="context"></param>
        /// <param name="jobException"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException? jobException, CancellationToken cancellationToken = default)
        {
            await Task.Run(() =>Console.WriteLine("執行後會觸發..........."));
        }
    }
}

 

TriggerListener.cs

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzScheduler.Listener
{
    /// <summary>
    /// Trigger監聽器
    /// </summary>
    public class TriggerListener : ITriggerListener
    {
        public string Name => "TriggerListener名稱";

        /// <summary>
        /// 在JobListener觸發完再觸發
        /// </summary>
        /// <param name="trigger"></param>
        /// <param name="context"></param>
        /// <param name="triggerInstructionCode"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine("TriggerListener---->TriggerComplete,在JobListener觸發完再觸發..........."));
            Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("");
        }

        /// <summary>
        /// 在JobListener觸發前觸發
        /// </summary>
        /// <param name="trigger"></param>
        /// <param name="context"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async  Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine("TriggerListener---->TriggerFired,在JobListener觸發前觸發 ..........."));
        }

        public async Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine("TriggerListener---->TriggerMisfired ..........."));
        }

        /// <summary>
        /// 返回true取消執行,false繼續執行
        /// </summary>
        /// <param name="trigger"></param>
        /// <param name="context"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default)
        {
            //返回true 只會執行TriggerFired方法
            return await Task.Run(() => {
                return false;
            });
        }
    }
}

 

SchedulerListener.cs

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzScheduler.Listener
{
    /// <summary>
    ///  Scheduler監聽器   https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/scheduler-listeners.html
    /// </summary>
    public class SchedulerListener : ISchedulerListener
    {
        /// <summary>
        /// Job被添加時
        /// </summary>
        /// <param name="jobDetail"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task JobAdded(IJobDetail jobDetail, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobAdded ******{jobDetail.Key.Name}"));
        }

        public async Task JobDeleted(JobKey jobKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobDeleted ******{jobKey.Name}"));
        }

        public async Task JobInterrupted(JobKey jobKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobInterrupted ******{jobKey.Name}"));
        }

        public async Task JobPaused(JobKey jobKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobPaused ******{jobKey.Name}"));
        }

        public async Task JobResumed(JobKey jobKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobResumed ******{jobKey.Name}"));
        }

        public async Task JobScheduled(ITrigger trigger, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobScheduled ******{trigger.Key.Name}"));
        }

        public async Task JobsPaused(string jobGroup, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobsPaused ******{jobGroup}"));
        }

        public async Task JobsResumed(string jobGroup, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobsResumed ******{jobGroup}"));
        }

        public async Task JobUnscheduled(TriggerKey triggerKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** JobUnscheduled ******{triggerKey.Name}"));
        }

        public async Task SchedulerError(string msg, SchedulerException cause, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulerError ******{msg}"));
        }

        public async Task SchedulerInStandbyMode(CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulerInStandbyMode ******"));
        }

        public async Task SchedulerShutdown(CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulerShutdown ******"));
        }

        public async Task SchedulerShuttingdown(CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulerShuttingdown ******"));
        }

        public async Task SchedulerStarted(CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulerStarted ******"));
        }

        public async Task SchedulerStarting(CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulerStarting ******"));
        }

        public async Task SchedulingDataCleared(CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** SchedulingDataCleared ******"));
        }

        public async Task TriggerFinalized(ITrigger trigger, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** TriggerFinalized ******{trigger.Key.Name}"));
        }

        public async Task TriggerPaused(TriggerKey triggerKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** TriggerPaused ******{triggerKey.Name}"));
        }

        public async Task TriggerResumed(TriggerKey triggerKey, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** TriggerResumed ******{triggerKey.Name}"));
        }

        public async Task TriggersPaused(string? triggerGroup, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** TriggersPaused ******{triggerGroup}"));
        }

        public async Task TriggersResumed(string? triggerGroup, CancellationToken cancellationToken = default)
        {
            await Task.Run(() => Console.WriteLine($"****** TriggersResumed ******{triggerGroup}"));
        }
    }
}

 

調用

internal class Program
    {
        static void Main(string[] args)
        {
            MyScheduler.SchedulerAction().GetAwaiter().GetResult();

            Console.Read();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章