十六、.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)+ ...
随机推荐
- SpringBoot简单尝试
一.spring boot核心 配置在类路径下autoconfigure下(多瞅瞅) @SpringBootApplication里的重要注解(@Configuration,@EnableAutoCo ...
- Git 系列教程(7)- 撤销操作
撤销操作 在任何一个阶段,你都有可能想要撤销某些操作 有些撤销操作是不可逆的 --amend 修补提交 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了. 此时,就可以运行带有 -- ...
- C++入门教程之二:变量
C++入门教程之二:变量 变量,顾名思义,意思是变化的量.变量的定义是计算机语言中能储存计算结果或能表示值的抽象概念.一个基本的程序需要变量,因此变量是程序设计中的一大重点. 变量基本结构 var_t ...
- 关于MDI多文档程序的一些思考
MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...
- 解决Latex输出PDF纸张自适应大小及中文无法显示问题
遗留的问题 之前我们进行了基于texlive定制chemfig化学式转换Python服务镜像,虽然完成pdf的输出服务改造,但是输出效果并不是太好,如下图: 这个图有两个比较严重问题 不支持中文 空白 ...
- Django(32)自定义过滤器
前言 虽然DTL给我们内置了许多好用的过滤器.但是有些时候还是不能满足我们的需求.因此Django给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求. 自定义过滤器 首先在某个app中,创建 ...
- [笔记] 《我的第一本c++书》
函数 优秀函数的五个要点 函数的返回值:直接返回和间接返回(指针) 在函数的入口处对参数有效性进行检验:if语句,断言(assert) 如果函数有返回值,不可返回一个指向函数体内局部对象的指针或引用 ...
- traceroute排查网络故障 www.qq.com排查网络故障网络不通 先ping自己
网络不通 先ping自己 在ping网关 再ping外网 再ping别人的ip 背景需求 Linux 因为其强大的网络处理能力,被广泛用于网关(实例链接)和服务器(实例链接).实际工作中,快速排查这些 ...
- ./g1.sh q w e r 5个参数 bash命令 获取 命令实际的参数 shell文件名称$0 第一个参数$1第2个参数$2 最后一个参数$#;参数个数$#个;所有的参数列出来$* 返回值$? 正确0 失败1
# ./g1.sh q w e r t./g1.sh q w e r5个参数number is q w e r t[root@localhost get]# cat g1.sh#!/bin/bash# ...
- kvm虚拟机管理(3)
一.远程管理kvm虚拟机 (1)上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机.其实 virt-manager 也可以管理其他宿主机上的虚机.只需要简单的将宿主机添加进 ...