NetCore 使用Quartz定时执行任务

1.Nuget

install-package Quartz.Extensions.Hosting

2.添加文件:WhileJob

/// <summary>
/// while quartz job
/// </summary>
[DisallowConcurrentExecution]
public class WhileJob : IJob
{
    #region 依赖注入

    /// <summary>
    /// 日志注入
    /// </summary>
    private readonly ILogger _logger;

    #endregion

    #region 构造函数注入

    /// <summary>
    /// 构造函数注入
    /// </summary>
    /// <param name="logger"></param>
    /// <param name="configuration"></param>
    public WhileJob(ILogger<WhileJob> logger)
    {
        _logger = logger;
    }

    #endregion

    /// <summary>
    ///
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public Task Execute(IJobExecutionContext context)
    {
        _logger.LogInformation("Hello World!");

        return Task.CompletedTask;
    }
}

3.添加文件:QuartzExtend

/// <summary>
    /// QuartZ.net 扩展类
    /// </summary>
    public static class QuartzExtend
    {
        /// <summary>
        /// 自定义扩展方法: 把Quartz添加到服务容器
        /// </summary>
        /// <param name="services"></param>
        /// <param name="configuration"></param>
        public static void AddCustQuartz(this IServiceCollection services, IConfiguration configuration)
        {
            // Add the required Quartz.NET services
            services.AddQuartz(q =>
            {
                // Use a Scoped container to create jobs. I'll touch on this later
                q.UseMicrosoftDependencyInjectionScopedJobFactory();

                //  控制是否运行quartz
                if (configuration["CustData:WhileRouterCron"].Equals("true"))
                {
                    q.AddCustJob<WhileJob>("0 * * * * ? *");
                }
            });
            // Add the Quartz.NET hosted service
            services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
            // other config
        }

        /// <summary>
        /// 封装Quartz添加job代码
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="q"></param>
        /// <param name="cron"></param>
        private static void AddCustJob<T>(this IServiceCollectionQuartzConfigurator q, string cron) where T : IJob
        {
            // Create a "key" for the job
            var keyName = typeof(T).Name;
            var jobKey = new JobKey(keyName);
            // Register the job with the DI container
            q.AddJob<T>(opts => opts.WithIdentity(jobKey));
            // Create a trigger for the job
            q.AddTrigger(opts => opts.ForJob(jobKey) // link to the job
                .WithIdentity($"{keyName}-trigger") // give the trigger a unique name
                .WithCronSchedule(cron)); // 定时启动

        }
    }

4.Startup.ConfigureServices

services.AddCustQuartz(_configuration);

5.防止IIS自动回收线程

5.1.IIS 防止自动回收
5.2.添加一个间隔20分钟的job,模拟请求当前应用的接口

6.在线生成Cron:Old / Current

posted @ 2023-01-13 16:22  Robot-Blog  阅读(297)  评论(0编辑  收藏  举报