推荐一款好用的任务定时器: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 吗。谁能给我推荐一下呢。
使用Quartz框架集成Spring,动态配置定时任务(个人思考)