十六、.net core(.NET 6)搭建基于Redis的Hangfire定时器
搭建基于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定时器的更多相关文章
- Spring+Shiro搭建基于Redis的分布式权限系统(有实例)
摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...
- Android实战简易教程-第六十六枪(server端搭建和server端Json数据交互)
学习Android有一段时间了.对server端有非常深的好奇,决定对server端的实现进行一些研究,这里实现了一个简单的小样例,用于获取server端的json数据,样例非常easy,适合刚開始学 ...
- Jmeter(二十六) - 从入门到精通 - 搭建开源论坛JForum(详解教程)
1.简介 今天这篇文章主要是给大家讲解一下,如何部署测试环境,这里宏哥部署一个开源测论坛,后边的文章中会用到这个论坛,并且也看到童鞋们在群里讨论如何在开发将测试包发给你以后,你如何快速地部署测试环境. ...
- Kubernetes5-集群上搭建基于redis和docker的留言薄
一.简介 1.环境依旧是kubernetes之前文章的架构 2.需要docker的镜像 1)php-forntend web 前端镜像 docker.io-kubeguide-guestbook-ph ...
- 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的路由方案,与原来的方案在使用上差别不 ...
- ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案
原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不大 ...
- 第十六节、基于ORB的特征检测和特征匹配
之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...
- abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理八(二十六)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十(四十六)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
随机推荐
- Java前后端分离的认识
1.原由 在网上查了关于前后端分离的资料,有所粗浅认识.记录下来,方便以后使用.以下均是个人看法,仅做参考.如有错误请指教,共同进步. 2.为什么前后端分离? ①.一个后台,可以让多种前台系统使用.后 ...
- @Scheduled 实现定时任务
@Scheduled注解实现定时任务 一.创建一个Springboot项目在启动类里加上@EnableScheduling 二.在写的定时任务的类上加上@Component把该类交由springboo ...
- java面试一日一题:如何设计一款垃圾回收器
问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...
- python爬虫——《英雄联盟》英雄及皮肤图片
还记得那些年一起网吧开黑通宵的日子吗?<英雄联盟>绝对是大学时期的风靡游戏,即使毕业多年的大学同学相聚,难免不怀念一番当时一起玩<英雄联盟>的日子. 今天就给大家分享一下英雄及 ...
- Educational Codeforces Round 101 (Rated for Div. 2)
A. Regular Bracket Sequence 题意:题目中给(和)还有?,其中?可以转换成为()中的任何一个,并且所给样例中只出现一次(),问能不能括号匹配 思路:直接看第一个和最后一个能不 ...
- C++将数值转换为string
std::to_string string to_string (int val); string to_string (long val); string to_string (long long ...
- 通过CRM系统实现工作流程自动化
灵活运用CRM系统所拥有的自动化功能模块,是公司在快速发展和降低成本的关键保障.不管您的公司规模的大小,您企业的工作流程都必须遵照相同的流程反复操作.这种反复的工作是一个效率黑洞,长久以往会导致人力资 ...
- mysql知识点归纳-锁(死锁)
愿历尽千帆,归来仍是少年 所遇问题: MySql 更新死锁问题 Deadlock found when trying to get lock; try restarting transaction 场 ...
- [项目] 淘淘商城 Part.2
商品列表查询 Easyui 商品添加 商品类目选择 图片上传 富文本编辑器使用 添加的实现 展示首页 略 分页插件 在SqlMapConfig.xml,配置一个plugin 在sql语句执行之前,添加 ...
- qemu:///system 没有连接驱动器可用;读取数据时进入文件终点: 输入/输出错误
原因 1. KVM的相关包 装少了 2KVM的相关包 重新安装 3 May 31 15:22:55 localhost libvirtd: 2019-05-31 07:22:55.554+0000: ...