搭建基于Redis的Hangfire定时器

Hangfire的定时配置信息会自动生成在指定到数据库内,包括关系型数据库或非关系型数据库内。目前为止,它在Redis、Oracle上面,可以支持最短15秒的定时周期,其他数据库是分钟级别到。以下使用Hangfire+Redis来实现定时任务。

首先创建新的类库项目 Wsk.Core.Hangfire,然后在Wsk.Core.Package包项目下引用hangfire有关的组件,包括 Hangfire、Hangfire.Core、Hangfire.Redis、Hangfire.Redis.StaskExchange

在Wsk.Core.Hangfire项目下,新增Hangfire连接Redis的配置实体类:

在配置文件新增基于redis的hangfire的数据库连接:

我的配置源码:

"Hangfire": {
"Config": {
"ConnectionString": "127.0.0.1:6379,password=wesky123,connectTimeout=1000,connectRetry=1,syncTimeout=10000",
"Db": 3 // 设置Hangfire使用的Redis的DB区
}
}

新建HangfireHelper类,并且新增一个用于读取配置hangfire信息的方法,用来把读取的数据,存储在先前创建的实体类上:

在原先的实体类新增一个JobStorage类型的变量,用来存储hangfire连接redis的storage:

实体类源码:

 public class HangfireConnectionOption
{
/// <summary>
/// Redis连接字符串
/// </summary>
public static string connectionString { get; set; }
/// <summary>
/// redis的DB区,默认0
/// </summary>
public static int db { get; set; } = 0; public static JobStorage hangfireStorage;
}

在HangfireHelper类里面,新增连接redis的方法,并且把连接的对象赋值到上面新增实体类的变量上:

Helper类源码:

 public class HangfireHelper: IHangfireHelper
{
private readonly ILogger<HangfireHelper> _logger;
public HangfireHelper(ILogger<HangfireHelper> logger)
{
_logger = logger;
} public void ReadHangfireConfig()
{
try
{
HangfireConnectionOption.connectionString = AppHelper.ReadAppSettings(new string[] { "Hangfire", "Config", "ConnectionString" });
HangfireConnectionOption.db = Convert.ToInt32(AppHelper.ReadAppSettings(new string[] { "Hangfire", "Config", "Db" }));
}
catch (Exception ex)
{
_logger.LogError($"读取hangfire配置信息出错:{ex.Message}");
}
} public void HangfireStorage()
{
// 默认使用Redis进行Hangfire定时调度任务
HangfireConnectionOption.hangfireStorage = new RedisStorage(HangfireConnectionOption.connectionString, new RedisStorageOptions
{
Db = HangfireConnectionOption.db, // REDIS 的 DB区
FetchTimeout = TimeSpan.FromMilliseconds(10), // 间隔多久读取一次,最低为15秒,所以此处设置低于15秒也是会默认为15秒 }); } }

然后开放该类对应的接口:

然后为了方便,我把hangfire类库项目全部通过autofac进行依赖注入注册:

然后,在Hosted启动项里面,新增Hangfire有关的配置信息的加载:

然后,在WskService里面,添加Hanfire的注册和连接:

在Wsk.Core.Hangfire类库项目下,新建一个过滤器MyHangfireFilter,用于允许远程访问Hangfire的可视化面板:

过滤器源码:

public class MyHangfireFilter : IDashboardAuthorizationFilter
{
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext(); return true; // 允许远程无限制访问
}
}

最后,在Startup启动类的Configure方法的最下边,添加Hangfire的一些配置,以及加入上面的过滤器配置,用于可以跨服务器远程访问并且无需密码;并且设置可视化面板为可读,用于不提供手动触发,如果需要尝试手动触发的,可以自己改为false:

现在写一个定时任务做个试验,新建类HangfireJobs,并且提供一个无参方法FirstJob以及对应接口:

在Startup的cnfigure方法最下方(配置hangfire以后),添加刚刚到定时任务,并设置了一个cron表达式,用来设置定时一秒执行一次的效果:

configure方法有关代码:

   app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
IgnoreAntiforgeryToken = true,
DashboardTitle = "Hangfire监控页面",
Authorization = new[] { new MyHangfireFilter() },
IsReadOnlyFunc = (DashboardContext context) => true // 设置为只读
}); RecurringJob.AddOrUpdate<IHangfireJobs>("MyFirstJob", x => x.FirstJob(), "0/1 * * * * ? ");

启动以后到结果:

可以看到,即使设置的是1秒,但是实际上是15秒才执行一次。我们打开可视化面看查看:

输入启动或发布的程序所在的ip:port/配置的看板,可在如下代码进行更改:

可视化页面如下所示:

页面功能,还请各位大佬亲自去探索,我就不一一介绍了。

最后,咱们看下hangfire自动写入到redis的一些配置信息:

可以看到,redis连接选择的BD是3,hangfire也自动把一系列配置信息写到redis里面来了。而且程序上面的配置信息,我们也可以看见。

最后,定时任务的cron表达式,建议做成可配置,可别像我这样写死啊~~~

以上就是hangfire的全部内容,欢迎留下宝贵意见。

十六、.net core(.NET 6)搭建基于Redis的Hangfire定时器的更多相关文章

  1. Spring+Shiro搭建基于Redis的分布式权限系统(有实例)

    摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...

  2. Android实战简易教程-第六十六枪(server端搭建和server端Json数据交互)

    学习Android有一段时间了.对server端有非常深的好奇,决定对server端的实现进行一些研究,这里实现了一个简单的小样例,用于获取server端的json数据,样例非常easy,适合刚開始学 ...

  3. Jmeter(二十六) - 从入门到精通 - 搭建开源论坛JForum(详解教程)

    1.简介 今天这篇文章主要是给大家讲解一下,如何部署测试环境,这里宏哥部署一个开源测论坛,后边的文章中会用到这个论坛,并且也看到童鞋们在群里讨论如何在开发将测试包发给你以后,你如何快速地部署测试环境. ...

  4. Kubernetes5-集群上搭建基于redis和docker的留言薄

    一.简介 1.环境依旧是kubernetes之前文章的架构 2.需要docker的镜像 1)php-forntend web 前端镜像 docker.io-kubeguide-guestbook-ph ...

  5. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  6. ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

    原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不大 ...

  7. 第十六节、基于ORB的特征检测和特征匹配

    之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理八(二十六)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十(四十六)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

随机推荐

  1. Spring Boot & Cloud 轻量替代框架 Solon 1.3.33 发布

    Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...

  2. keep-alive与生命周期函数

    理解keep-alive keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 router-view也是一个组件,如果直接被keep-alive包在里面,所有路径匹 ...

  3. Django(13)django时区问题

    前言 我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,所以我们存储在数据库中的时间是UTC的时间,但是当我们做的网站只面向国内用户,或者只是提供内部平台使用,我们希望存储在 ...

  4. 逆向工程初步160个crackme-------1

    放假在家学习的效率真的很低,看完看雪加密解密的前两章就迫不及待的找了几个crackme练习一下,顺便熟悉ollydbg的使用. 工具:exeinfope(查壳工具),ollydbg(2.10版) 1. ...

  5. 用 edgeadm 一键安装边缘 K8s 集群和原生 K8s 集群

    背景 目前,很多边缘计算容器开源项目在使用上均存在一个默认的前提:用户需要提前准备一个标准的或者特定工具搭建的 Kubernetes 集群,然后再通过特定工具或者其他方式在集群中部署相应组件来体验边缘 ...

  6. base64stego 还不懂base64的隐写,详解15行代码带你领略

    网上写了好多关于xctf MISC新手篇的base64Stego隐写的教程,但大都不太清楚,基本上都是讲了一段隐写原理,直接上代码了.但是代码是这道题的关键,代码讲了如何解码这个隐写的完整流程,这次我 ...

  7. NIOSII IDE在WIN7下 couldn't allocate heap

    首先,所有的文件夹都不能有空格和中文 其次,出现这些SB错误 make -s all includes 3 [main] ? (3732) c:\altera\91\quartus\bin\cygwi ...

  8. OO第三单元作业(JML)总结

    OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...

  9. JDBC核心技术(获取数据库链接、数据库事务、数据库链接池)

    @ 目录 前言 数据的持久化 Java数据存储技术 JDBC介绍 JDBC体系结构 获取数据库链接 Driver接口 加载注册JDBC驱动 获取数据库链接 数据库链接方式(实例) 方式一:代码中显示出 ...

  10. Django(33)Django操作cookie

    前言 cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第一次登录 ...