搭建基于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. killable thread的python实现

    python没有为内置的threading.Thread类提供一个kill接口,可以通过使用CPython API向线程抛出一个SystemExit异常来终止线程.如果线程没有被系统调用阻塞(slee ...

  2. ConcurrentHashMap源码解读二

    接下来就讲解put里面的三个方法,分别是 1.数组初始化方法initTable() 2.线程协助扩容方法helpTransfer() 3.计数方法addCount() 首先是数组初始化,再将源码之前, ...

  3. 从刚毕业的5K测试到20K测试大佬,与薪资相匹配的永远是实力!

    有个话题"软件测试的工资高还是开发者的工资高?"软件测试和软件开发门槛有差异,在职业起步阶段收入也会有一定的差异,这算是行业内公开的秘密.但随着工作年限的增加,经验的逐步积累,软件 ...

  4. .NET 在信创常用软件适配清单之中?

    2020年8月份写了一篇文章<.NET Core也是国产化信息系统开发的重要选项>, 这又过去了大半年了,在信创领域发生了很大的变化,今天写这篇文章主要是想从信创常用软件适配清单 看一看. ...

  5. 逆向工程初步160个crackme-------7

    这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...

  6. 消息队列RabbitMQ(三):消息确认机制

    引言 RabbitMQ的模型是生产者发送信息到 Broker (代理),消费者从 Broker 中取出信息.但是生产者怎么知道消息是否真的发送到 Broker 中了呢?Broker 又怎么知道消息到底 ...

  7. 通过CRM系统改变传统工作模式

    在现在这个互联网时代,同行业的竞争越发激烈,因此许多企业都选择使用CRM来提高企业的销售业绩.CRM客户关系管理系统是能够优化企业的销售流程.维护良好的客户关系.对销售流程进行管理的强大工具.但是很多 ...

  8. 放弃模拟器,安卓手机WiFi投屏到Ubuntu

    曾经使用过一些安卓的模拟器,但是特别占用资源,而且很多平时使用的非游戏生活类App都有兼容性问题,自然最终无奈而放弃了. 现在将学习环境迁移到了Ubuntu平台,发现各个方面还是不错的,平时使用的各种 ...

  9. 33.2.NIO

    4.1概述[理解] BIO Blocking IO,阻塞型IO NIO No Blocking IO,非阻塞型IO 阻塞IO的弊端 在等待的过程中,什么事也做不了 非阻塞IO的好处 不需要一直等待,当 ...

  10. [Linux] Shell 脚本实例(超实用)

    文件操作 为文件(test.sh)增加执行权限 chmod +x test.sh 列出当前文件夹下所有文件(每行输出一个) 1 #!/bin/bash 2 dir=`ls ./` 3 for i in ...