推荐一款好用的任务定时器:Quartz

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐一款好用的任务定时器:Quartz相关的知识,希望对你有一定的参考价值。

前言

官网:https://www.quartz-scheduler.net/ 一款开源的任务定时器。
日常有很多地方需要定时刷新的,比如微信开发中的微信API token,或者定时清理一下缓存数据等,应用场景还是比较常见。
接下来介绍一下这个简单好用的库。

引用

在Nuget管理中添加引用: Quartz.dll

命名空间:
using Quartz;
using Quartz.Impl;

写一个Task

实现一个task,按时刷新API的token:

public async Task RefreshAzulApiTokenJob(IScheduler scheduler)
    {
        var tokenJobName = "RefreshAzulToken";
        IJobDetail tokenJob = JobBuilder.Create<RefreshAzulTokenJob>()
            .WithIdentity($"{tokenJobName}Job", $"{tokenJobName}Group")
            .Build();
        ITrigger tokenTrigger = TriggerBuilder.Create()
            .WithIdentity($"{tokenJobName}Trigger", $"{tokenJobName}Group")
            .StartNow()
            .WithSimpleSchedule(x => x
                .WithIntervalInSeconds(RefreshAzulTokenInterval)
                .RepeatForever())
            .Build();
        await scheduler.ScheduleJob(tokenJob, tokenTrigger);
    }

主要是创建一个Job,这个Job就是一个要定时运行的Task,创建一个Trigger,在Trigger里面自定义设置interval时间。

Job实现

1.创建一个类,用来处理这个任务的业务逻辑,比如这个刷新token:

public class RefreshAzulToken
{
    public static readonly ILogger logger;
    private static readonly RedisUtils redisUtils;

    static RefreshAzulToken()
    {
        logger = LoggerFactory.GetLogger("RefreshAzulToken", EnvSettings.ElkAddress);
        redisUtils = ChatbotApiServiceManager.RedisUtils;
    }
    public static async Task Excutor()
    {
        try
        {
            logger.Information(new ApiRequestEvent()
            {
                EventType = LogEventType.RefreshAzulTokenStart,
                Message = $"Start to get api token..."
            });
            var tokenRequestUrl = EnvSettings.AzulTokenUrl;
            string tokenPostData = "client_id=indigo&client_secret=2lw$IE6GIwsnlUYh&grant_type=client_credentials";
            string tokenResponse = await AzulApiClient.AzulHttpClient(true, tokenRequestUrl, tokenPostData);
            var token = JsonConvert.DeserializeObject<AzulAccessToken>(tokenResponse);
            logger.Information(new ApiRequestEvent()
            {
                EventType = LogEventType.RefreshAzulTokenComplete,
                Message = $"Refresh api token succeed, token:{token.AccessToken}"
            });
            redisUtils.SetAzulApiToken(token.AccessToken);
            logger.Information(new ApiRequestEvent()
            {
                EventType = LogEventType.RefreshAzulTokenComplete,
                Message = $"Save token into Redis succeed, token:{redisUtils.GetAzulApiToken()}"
            });
        }
        catch (Exception ex)
        {
            logger.Error(new ExceptionEvent()
            {
                EventType = LogEventType.RefreshAzulTokenError,
                Message = $"Refresh Azul api token failed.",
                Exception = ex,
            });
        }
    }
}

2.创建另外一个类,这个类继承Quartz中的IJob,调用上面业务逻辑的方法:

public class RefreshAzulTokenJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        await RefreshAzulToken.Excutor();
    }
}

这样一个简单的Task Job 就创建好了,RefreshAzulTokenJob 就是第一步里面创建Job的参数。

Job启动

在应用程序的starup.cs里,启动这个Scheduler Task:

TaskScheduler().Scheduler().GetAwaiter().GetResult();

以上是关于推荐一款好用的任务定时器:Quartz的主要内容,如果未能解决你的问题,请参考以下文章

java 任务调度 框架比较多 那个 最好用呢 .. quartz 吗。谁能给我推荐一下呢。

springboot-01整合quartz

Dubbo学习系列之十二(Quartz任务调度)

使用Quartz框架集成Spring,动态配置定时任务(个人思考)

使用Quartz框架集成Spring,动态配置定时任务(个人思考)

对quartz定时任务的初步认识