Hangfire是一款定时调度服务框架,目前已支持Net6,最大的特点是内置控制台,直观监控服务运行性能。
Hangfire包含三大核心组件:客户端、持久化存储、服务端。
理论知识就不阐述了,直接上代码:
首先要用到2个包:
注册服务:
//注入Hangfire服务
services.AddHangfire(config => config.UseSqlServerStorage("数据库连接字符串"));
配置服务:
//强制显示中文
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
//配置hangfire服务
app.UseHangfireServer(new BackgroundJobServerOptions
{
WorkerCount = Environment.ProcessorCount * 5, //并发任务数
ServerName = "xx系统定时调度"
});
//hangfire权限
app.UseHangfireDashboard(#34;/service/hangfire", new DashboardOptions()
{
Authorization = new BasicAuthAuthorizationFilter[] {
new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions(){
SslRedirect=false,
RequireSsl=false,
Users=new BasicAuthAuthorizationUser[]{
new BasicAuthAuthorizationUser(){
Login="用户", //也可以将这个写入数据库
PasswordClear="密码"
}
}
})
}
});
//初始化Interval
IntervalService.Create(app.ApplicationServices);
上述就是简单实现了调度任务,接下来实现初始化任务以及任务创建方法,上面使用到:IntervalService 这个类,接下来实现这个类的方法
public class IntervalService
{
/// <summary>
/// 初始化任务创建
/// </summary>
/// <param name="provider"></param>
public static void Create(IServiceProvider provider)
{
IntervalService test = (IntervalService)FormatterServices.GetUninitializedObject(typeof(IntervalService));
test.Start();
}
/// <summary>
/// 主线程开始
/// </summary>
public void Start()
{
//每天早上5点运行一次
RecurringJob.AddOrUpdate("任务名称", () => 具体实现方法, "0 0 5 * * ?", TimeZoneInfo.Local);
}
}
这里的执行时间是:Cron表达式 ,目前有很多在线生成Cron表达式的网站,这里介绍几个常用的表达式:
/// Cron表达式示例:
/// 0 0 12 * * ? 每天12点运行
/// 0 15 10 ? * * 每天10 : 15运行
/// 0 15 10 * * ? 每天10 : 15运行
/// 0 15 10 * * ? * 每天10 : 15运行
/// 0 0/5 * * * ? 每分钟运行一次
/// 0 15 10 * * ? 2008 在2008年的每天10:15运行
/// 0 * 14 * * ? 每天14点到15点之间每分钟运行一次,开始于14: 00,结束于14: 59。
/// 0 0 / 5 14 * * ? 每天14点到15点每5分钟运行一次,开始于14: 00,结束于14: 55。
/// 0 0 / 5 14,18 * * ? 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
/// 0 0 - 5 14 * * ? 每天14 : 00点到14: 05,每分钟运行一次。
/// 0 10,44 14 ? 3 WED 3月每周三的14: 10分到14: 44,每分钟运行一次。
/// 0 15 10 ? * MON - FRI 每周一,二,三,四,五的10: 15分运行。
/// 0 15 10 15 * ? 每月15日10 : 15分运行。
/// 0 15 10 L * ? 每月最后一天10 : 15分运行。
/// 0 15 10 ? * 6L 每月最后一个星期五10:15分运行。
/// 0 15 10 ? * 6L 2007 - 2009 在2007,2008,2009年每个月的最后一个星期五的10: 15分运行。
/// 0 15 10 ? * 6#3 每月第三个星期五的10:15分运行。
避坑指南:
如操作系统是linux,则可能会出现时差问题(晚上变白天执行),有些说需要在代码中TimeZoneConverter依赖,亲身经历无效果,最后在服务器上执行:
设置:\cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
查看:date
如果是docker部署,则需要dockerfile文件里设置:
#设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
运行程序后,在路径中输入: /service/hangfire,即可看到运行界面,程序初次运行时有点慢,会自动创建表,如果是需要使用新库则先创建库。
至此定时服务已经完成,看下运行效果如下:
下一篇介绍:Hangfire之Mysql 版本
本文暂时没有评论,来添加一个吧(●'◡'●)