zoukankan      html  css  js  c++  java
  • 推荐一款好用的任务定时器: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();
  • 相关阅读:
    java-selenium三种等待方式
    java-selenium八种元素定位方式
    java-selenium浏览器常用操作命令
    ELK日志分析平台搭建全过程
    详解Oracle架构、原理、进程
    Oracle建立约束、删除约束
    OGG基础知识整理
    由浅入深解读Redis高级能力及性能调优
    《收获,不止Oracle》读书笔记
    转:一条sql语句在mysql中是如何执行的
  • 原文地址:https://www.cnblogs.com/shy-huang/p/10538693.html
Copyright © 2011-2022 走看看