zoukankan      html  css  js  c++  java
  • C# Quartz.Net 定时任务的简单使用

    引用自:https://www.cnblogs.com/chenyucong/p/6264739.html,仅用做参考。

    最近做了一个定时执行任务的软件。

    执行任务时,会使用log4net记录日志,如果执行任务有异常,则发送邮件给指定的对象。

    我做的是每天的9点和16点执行一次任务,以此记录:

    首先,获得Quartz.Net,

    其实可以使用vs2015的Nuget管理器,下载。

    我做了一个QuartzHelper,但是在主程序中,还是需要其他代码的。

    这是QuartzHelper的代码:

    复制代码
    using Quartz;
    using Quartz.Impl;
    
    namespace Cong.Utility
    {
        public class QuartzHelper
        {
            /// <summary>
            /// 时间间隔执行任务
            /// </summary>
            /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
            /// <param name="seconds">时间间隔(单位:毫秒)</param>
            public static void ExecuteInterval<T>(int seconds) where T : IJob
            {
                ISchedulerFactory factory = new StdSchedulerFactory();
                IScheduler scheduler = factory.GetScheduler();
    
                //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
                IJobDetail job = JobBuilder.Create<T>().Build();
    
                ITrigger trigger = TriggerBuilder.Create()
                    .StartNow()
                    .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
                    .Build();
    
                scheduler.ScheduleJob(job, trigger);
    
                scheduler.Start();
            }
    
            /// <summary>
            /// 指定时间执行任务
            /// </summary>
            /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
            /// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
            public static void ExecuteByCron<T>(string cronExpression) where T : IJob
            {
                ISchedulerFactory factory = new StdSchedulerFactory();
                IScheduler scheduler = factory.GetScheduler();
    
                IJobDetail job = JobBuilder.Create<T>().Build();
    
                //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
                //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
    
                ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                    //.StartAt(startTime).EndAt(endTime)
                    .WithCronSchedule(cronExpression)
                    .Build();
    
                scheduler.ScheduleJob(job, trigger);
    
                scheduler.Start();
    
                //Thread.Sleep(TimeSpan.FromDays(2));
                //scheduler.Shutdown();
            }
        }
    
        #region 任务执行例
        //public class MyJob : IJob
        //{
        //    public void Execute(IJobExecutionContext context)
        //    {
        //        Console.WriteLine("executed..." + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
        //    }
        //} 
        #endregion
    }
    复制代码

    大概的过程是这样的:
    通过ISchedulerFactory实例化一个计划工厂对象,并使用工厂实例化一个scheduler计划对象,

    然后实例化一个任务对象job,也就是定义任务内容的对象,需要传入一个实现IJob接口的类,这里我使用了泛型,

    接着,需要一个能触发任务的对象,这里有两种,

    一种是ITrigger,这是用于规格时间间隔,计划开始后,会根据间隔的时间值,触发执行任务;

    另一种是ICronTrigger,这是通过Cron表达式规格执行的时间,计划开始后,如果时间符合规定时间,就触发执行任务。

    最后,把job和trigger都传入计划scheduler,计划开始。

    最下方的任务执行例是一个例子,

    必须实现IJob接口和Execute方法。

    如果需要在Execute方法内,调用类外部的数据,我是通过在项目中定义静态类的方法,供MyJob调用的。

    程序开始计划的代码:

    string cronExpression = "0 0 9,16 * * ? ";  =>这是指每天的9点和16点执行任务
    QuartzHelper.ExecuteByCron<MyJob>(cronExpression);  =>这是调用Cron计划方法

    简单说一下Cron表达式吧,

    "0 0 9,16 * * ? ",

    顺序从左到右

    0:秒

    0:分

    9,16:小时,逗号分隔

    如果需要更详细的说明,可以百度。

     
    分类: C#
  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Mysql 使用 select into outfile
    Mysql 使用CMD 登陆
    使用Clean() 去掉由函数自动生成的字符串中的双引号
    Get Resultset from Oracle Stored procedure
    获取引用某个主键的所有外键的表
    Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
    添加MySql Metat Database 信息
    at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15611510.html
Copyright © 2011-2022 走看看