编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Hangfire之Mssql版本(mssql2016)

wxchong 2024-07-05 01:52:22 开源技术 12 ℃ 0 评论

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 版本

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表