推薦一款好用的任務定時器: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();


免責聲明!

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



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