.NET Core Hangfire周期性作业调度问题
前言
四月中旬Hangfire团队发布了1.7.11版本,在使用周期性作业调度过程中发现一个问题,这个问题应该一直未解决,故做此记录,希望遇到的童鞋根据项目业务而避开这个问题。
周期性作业调度
我们依然是在控制台中进行测试,下载所需包请参考官方文档,这里不再叙述,首先我们在内存中存储数据,如下:
var storageOpts = new MemoryStorageOptions();
GlobalConfiguration.Configuration.UseMemoryStorage(storageOpts);
using var server = new BackgroundJobServer();
RecurringJob.AddOrUpdate("job1", () => Print1(), "*/10 * * * * *", TimeZoneInfo.Local);
RecurringJob.AddOrUpdate("job2", () => Print2(), "*/10 * * * * *", TimeZoneInfo.Local);
RecurringJob.AddOrUpdate("job3", () => Print3(), "*/10 * * * * *", TimeZoneInfo.Local);
public static void Print1()
{
Console.WriteLine("start1");
} public static void Print2()
{
Console.WriteLine("start2");
} public static void Print3()
{
Console.WriteLine("start3");
}
Hangfire目前已支持秒级周期作业调度,如上代码,我们每隔10秒执行上述3个作业,打印如下:

基于内存存储间隔10秒执行对应作业,根据上述打印结果来看没有问题,接下来我们使用SQLite来存储作业数据看看,首先下载Hangfire.SQLite包,针对控制台需进行如下配置
GlobalConfiguration.Configuration.UseSQLiteStorage("Data Source=./hangfire.db;");
当我们启动控制台时一定会抛出如下异常,其异常旨在表明需要SQLite驱动

我们去下载微软官方针对SQLite的驱动(Microsoft.Data.Sqlite)

接下来我们将发现对于每一个作业都会重复执行多次,如下:

猜测只会在SQLite数据库中才会存在问题吧,为了解决这个问题,做了一点点尝试,但还是无法从根本上完全解决,我们知道Hangfire服务的默认工作数量为当前机器的处理器数量乘以5即(Environment.ProcessorCount * 5),那么我们尝试给1是不是可以规避这个问题
var options = new BackgroundJobServerOptions()
{
WorkerCount =
}; using var server = new BackgroundJobServer(options);

上述设置后,我们可以看到貌似只执行了一次,但是这种情况还是是随机的并不靠谱,比如多执行几次看看,会出现如下可能情况

没招了,找了下官方issue列表,发现此问题(https://github.com/mobydi/Hangfire.Sqlite/issues/2)一直处于打开状态并未得到解决,所以要么看看能否根据项目业务规避这个问题或者下载源码自行调试解决
总结
本文是在使用Hangfire过程中发现SQLite数据库出现的问题,因针对Hangfire的SQLite具体实现并不是官方团队所提供,所以暂不能确定到底是Hangfire.SQLite包提供者的问题,根据issue描述大概率是Hangfire的一个bug,希望在SQLite存储作业等数据存在的问题引起使用者注意。
.NET Core Hangfire周期性作业调度问题的更多相关文章
- 解决 ASP.NET Core Hangfire 未授权(401 Unauthorized)
相关文章:ASP.NET Core 使用 Hangfire 定时任务 ASP.NET Core Hangfire 在正式环境发布之后,如果访问 http://10.1.2.31:5000/hangfi ...
- 跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...
- python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题
问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...
- HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题
解决方法:在执行的任务方法前加上Mutex特性即可,如果作业未完成,新作业开启的话,新作业会放入计划中的作业队列中,直到前面的作业完成. 必须使用Hangfire.Pro.Redis 和 Hangfi ...
- 使用回溯法解批处理作业调度问题<算法分析>
一.实验内容及要求 1.要求用回溯法原理求解问题: 2.要求手工输入t1[10]及t2[10],t1[i]是任务i在机器1上的执行时间,t2[i]是任务i在机器2上的执行时间: 3.求出最优批处理作业 ...
- 如何防止Hangfire重复作业在连续执行30分钟后重新启动(How to prevent a Hangfire recurring job from restarting after 30 minutes of continuous execution)
var options = new SqlServerStorageOptions { InvisibilityTimeout = TimeSpan .FromMinutes(30)//默认值}; G ...
- Core 定时任务之HangFire
ASP.NET Core 使用 Hangfire 很简单,首先,Nuget 安装程序包 > install-package Hangfire -pre 然后ConfigureServices添加 ...
- Hangfire在ASP.NET CORE中的简单实现
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
- .NET Core下开源任务调度框架Hangfire
今天无意中发现了一个很好用的任务调度框架.Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在 .net core的环境中,由Core自带的DI管理着生命周期. 相较于qu ...
随机推荐
- webpack-dev-server 使用 react-router 启用 browserhistory 采坑记
问题的产生 今天下午请假,忙完手头事之后,在家实在无聊,想着从0开始搭建一个 react 的项目.webpack 基本配置之前研究过,没什么大问题.谁想,在 react-router 的配置时出现了个 ...
- [批处理教程之Shell]002.Linux 常用命令大全
这一次收集的是比较基础的 Linux 命令,其实 Linux 命令未必每个都要记住,只要在用到时能查阅到需要的命令的用法. 系统信息 *.显示机器的处理器架构(1)arch *.显示机器的处理器架构( ...
- nacos 配置
具体请访问 https://nacos.io/zh-cn/docs/what-is-nacos.html 网站查看文档,现在开始使用Nacos. 1. 下载Nacos源码 Nacos可以通过 http ...
- 使用 Typora 编辑器运用 Markdown 的语法编写文档
Markdown 介绍 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建. ...
- jchdl - GSL实例 - Mux4
https://mp.weixin.qq.com/s/hh0eExVFC6cxzpvNI1cA9A 使用门实现四选一选择器. 原理图 参考链接 https://github.com/wjcdx/ ...
- Rocket - 断句 - Diplomacy and TileLink from the Rocket Chip
https://mp.weixin.qq.com/s/rfgptF9YxDpzDoespYtQvA 整理Diplomacy and TileLink from the Rocket Chip这篇文 ...
- java方法句柄-----3.方法句柄的实现接口
目录 1.使用方法句柄实现接口 1.使用方法句柄实现接口 2.3节介绍的动态代理机制可以在运行时为多个接口动态创建实现类,并拦截通过接口进行的方法调用.方法句柄也具备动态实现一个接口的能力.这是通 ...
- Java实现 蓝桥杯 算法训练 字串统计
算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...
- Java实现 蓝桥杯 算法提高 新建Microsoft world文档
算法提高 新建Microsoft Word文档 时间限制:1.0s 内存限制:256.0MB 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:"你出的题目叫&l ...
- Java实现 LeetCode 17 电话号码的字母组合
17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...