.Net Core 定時器Quartz


最近因為項目需要用到了Quartz,下面簡單記錄一下。

一、首先需要安裝Quartz。

二、定義一個執行的Job類,實現IJob接口,接口有一個方法Execute,用來執行定時任務的實現內容。

    public class HelloJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine("作業執行!");
        }
    }

三、定時觸發,根據設定的時間間隔觸發。

            //從工廠中獲取一個調度器實例化
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            await scheduler.Start();       //開啟調度器

            //==========例子1(簡單使用)===========

            IJobDetail job1 = JobBuilder.Create<HelloJob>()  //創建一個作業
                .WithIdentity("job", "group1")
                .Build();

            ITrigger trigger1 = TriggerBuilder.Create()
                .WithIdentity("trigger", "group1")
                .StartNow()                        //現在開始
                .WithSimpleSchedule(x => x         //觸發時間,5秒一次。
                    .WithIntervalInSeconds(5)
                    .RepeatForever())              //不間斷重復執行
                .Build();


            await scheduler.ScheduleJob(job1, trigger1);      //把作業,觸發器加入調度器。

四、僅觸發一次,定時器在設定時間內,只觸發一次。

            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            IJobDetail job = JobBuilder.Create<HelloJob>()  //創建一個作業
                .WithIdentity("job3", "group3")
                .Build();

            ITrigger trigger = trigger = (ISimpleTrigger)TriggerBuilder.Create()
                .WithIdentity("trigger3", "group3")
                .StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second)) //使用DateBuilder將來創建一個時間日期
                .ForJob(job) //通過JobKey識別作業
                .Build();

            await scheduler.ScheduleJob(job,trigger);
            await scheduler.Start();

五、移除定時任務

調用公共方法,實現定時任務移除

  JobKey JKey = new JobKey("job", "group1");
  TriggerKey TKey = new TriggerKey("trigger", "group1");
  await QuartzHelper.RemoveJob(JKey, TKey);

封裝了一個定時器的公共類,方便程序復用。

    public static class QuartzHelper
    {
        public static async Task RemoveJob(JobKey jobKey, TriggerKey triggerKey)
        {
            try
            {
                var scheduler = await TaskDeadLineEndJob.GetSchedulerAsync();
                var state = await scheduler.GetTriggerState(triggerKey);
                if (state == TriggerState.None)
                {
                    return;
                }
                await scheduler.PauseTrigger(triggerKey);// 停止觸發器
                await scheduler.UnscheduleJob(triggerKey);// 移除觸發器
                await scheduler.DeleteJob(jobKey);// 刪除任務
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

 定義一個工廠類,用來保證定時任務是唯一的,如果每次都new一個新實例,后面可能會出問題。

   public class TaskDeadLineEndJob
    {
        private static IScheduler scheduler;
        private static Task<IScheduler> TaskScheduler;
        private static readonly object padlock = new object();

        public static async Task<IScheduler> GetSchedulerAsync()
        {
            lock (padlock)
            {
                // 如果類的實例不存在則創建,否則直接返回
                if (scheduler == null)
                {
                    ISchedulerFactory schedf = new StdSchedulerFactory();
                    TaskScheduler = schedf.GetScheduler();
                }
                else
                {
                    return scheduler;
                }
            }
            return await TaskScheduler;
        }

        public TaskDeadLineEndJob()
        {
            try
            {
                Task.Run(async () =>
                {
                    // 開啟調度器
                    scheduler = await GetSchedulerAsync();
                    await scheduler.Start();
                });
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

 


免責聲明!

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



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