zoukankan      html  css  js  c++  java
  • .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;
                }
            }
        }
  • 相关阅读:
    示例 json with js
    JS json
    jquery
    发布包规范
    20180320待编辑
    CefSharp中c#和js交互
    列举mvc ActionResult的返回值
    怎么实现第三方登录
    mvc @Html控件
    MVC webuploader 图片
  • 原文地址:https://www.cnblogs.com/zhangjd/p/11188908.html
Copyright © 2011-2022 走看看