欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-08 19:15:18
前言 官网:https://www.quartz scheduler.net/ 一款开源的任务定时器。 日常有很多地方需要定时刷新的,比如微信开发中的微信API token,或者定时清理一下缓存数据等,应用场景还是比较常见。 接下来介绍一下这个简单好用的库。 引用 在Nuget管理中添加引用: Qu ......

前言

官网: 一款开源的任务定时器。
日常有很多地方需要定时刷新的,比如微信开发中的微信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();