HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...

背景

HangFire有个很奇怪的现象,就是即使你设置的循环作业是一天一次,但是每次作业执行很长时间,我们假设是1小时,那么差不多在开始执行之后的30分钟之后,如果还在执行job,系统就会自动帮你重新开启了新的job执行。也就是撇开循环周期的影响,我一个长时间的作业,超过三十分钟的,那么系统又会在你还在执行的时候,三十分钟之后又起一个来帮你执行。

问题窥探

我之前做项目的时候,就遇到这个问题,莫名其妙。开始的时候,我还以为可以像Quartz加个[DisallowConcurrentExecution]了事。

后面找到这个

706eee227b22ecf7e1b28166c8d54308.png

但是测试了下,不起作用啊。而且一旦启用分布式部署,这个就算有用,到时候不也没用了,后面想想直接来个干脆的,分布式锁。

解决办法

1、进入job的时候,定义一个key,判断是否正在执行。

string uniqueKey = string.Empty;string key = "xxxxx";if (!CacheExtension.getInstance().AddUnique($"{key}_unique", 1, DateTimeOffset.Now.AddDays(365))){LogExtention.getInstance().WriteCustomLogAsync("", "", true, "上批次还未执行结束--xxxxxxjob");return;}uniqueKey = $"{key}_unique";

2、redis-StringSet保证key是唯一的。

/// <summary>/// 新增,若缓存中已存在相同KEY,则返回false,判断高并发时使用/// </summary>public bool AddUnique(string key, object o, DateTimeOffset expiration, string dependsOnKey = null){key = AddSysCustomKey(key);var ts = expiration - DateTimeOffset.Now;return _client.StringSet(key, ConvertJson(o), ts, When.NotExists);}

3、执行完成的时候,去掉锁。

try{//todo            }finally{ 
‍                ‍CacheExtension.getInstance().Remove(uniqueKey);}

总结

1、这样的话,就能在旧的还未完成之前,新的进来,直接return,保证唯一性,也支持了分布式处理。

2、分布式锁在很多场景,还是很实用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

virtual多态 你不知道的事情

<1>如果父子类虚函数都有默认参数&#xff0c;这种情况下根据指针类型来调用对应函数<2>构造过程中&#xff0c;虚表还没有建立&#xff0c;此时在构造或析构函数中调用虚函数为静态调用<3>const类型函数和非const类型函数不构成覆盖(多态)<4>返回类型…

linux之查看文件大小、文件夹的大小和分区磁盘速度

1 查看文件大小 查看文件大小的命令 ls -l filename 比如: 注意这个 1243870 是 单位是B 2 查看文件夹的大小 查看文件夹的大小,也就是查看文件夹下所有文件的大小总和 先进入这个目录: cd FoldeName 命令如下: du -sh 3 查看分区磁盘速度 命令如下:

用户和组管理命令

回顾&#xff1a;bash globing IO重定向及管道glob通配符&#xff1a; *,?,[],[^]IO重定向&#xff1a; > >>2> 2>>&> &>>>/PATH/TO/SOMEFILE 2>&1 //&1表示引用前面的路径<…

各个版本spring的jar包以及源码下载地址

各个版本spring的jar包以及源码下载地址&#xff0c;目前最高版本到spring4.1.2&#xff0c;留存备用&#xff1a; http://maven.springframework.org/release/org/springframework/spring/ 转载于:https://www.cnblogs.com/elgin-seth/p/5293785.html

python基本随机数生成函数有_Python中生成随机数的常用方法

注意&#xff1a;random模块中的方法是不能直接访问的&#xff0c;需要导入 random 模块&#xff0c;然后通过 random 静态对象调用方法。random.random()random()方法返回随机生成的一个实数(浮点数)&#xff0c;它在[0,1)范围内。原型为random.random()random() 方法的语法格…

再谈“开源软件供应链安全”

| 作者&#xff1a;庄表伟| 编辑&#xff1a;刘雪洁| 设计&#xff1a;周颖| 责编&#xff1a;王玥敏缘起之前写过一篇文章《我所理解的开源软件供应链安全》&#xff0c;当时的情况&#xff0c;还没有出现一些值得探讨的&#xff0c;堪称紧迫的热点事件&#xff0c;所以我也仅…

python 测试框架

2019独角兽企业重金招聘Python工程师标准>>> # -*- encodeing:utf-8 -*- import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.size 4 def tearDown(self): self.size 0 def testSize(self): self.assertEqual(self.size, 4) def su…

从抛硬币试验看随机游走定义的基本概念错误

全世界只有3.14 % 的人关注了爆炸吧知识随机游走&#xff08;Random Walk&#xff09;是《随机过程》教科书中用于描述动态随机现象的一种基本随机过程&#xff0c;许多重要的随机过程都可由它派生出来&#xff0c;其理论不仅在随机过程中占有相当重要的地位&#xff0c;而且也…

正则表达式学习手册

效果图<ignore_js_op style"word-wrap: break-word;">详细说明&#xff1a;http://java.662p.com/thread-3932-1-1.html转载于:https://www.cnblogs.com/huasili/p/4152584.html

excel下划线转驼峰公式

最近为了省事&#xff0c;决定从excel将表结构生成jquery.datatable的json对象结构&#xff0c;其中要把下划线转驼峰&#xff0c;如下&#xff1a; LEFT(C251,1)&MID(SUBSTITUTE(PROPER(C251),"_",""),2,100)

NSCoding和NSCopy

为什么80%的码农都做不了架构师&#xff1f;>>> 很多时候我们都需要将对象序列化&#xff0c;比如将一个对象存入到NSUserDefault 里面去的时候&#xff0c;由于NSUserDefault支持存入的类型有限制&#xff0c;所以很多时候我们需要将NSObject类型的对象转换成NSDa…

如何获取 Process.Start 打开进程的输出结果?

咨询区 stighy我想用 C# 通过控制台开启一个外部程序&#xff0c;理论上我就可以让程序和这个外部程序实现交互&#xff0c;但现在我遇到了两个问题。如何获取控制台上的输出呢&#xff1f;我想将结果写到我的 textbox 上。如何获取数值型的值让我可以展示进度条。回答区 Ferru…

如何判断对象是不是出轨了?

1 教官让学生表演才艺&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 人类幼崽的想象力能有多丰富&#xff1f;&#xff08;素材来源豆瓣&#xff0c;侵删&#xff09;▼3 来自医生的建议&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这个手机壳很不…

MVC-控制器向View传值的三种方法

1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResult Index() { DateTime date DateTime.Now; return View(date); } 然后我们在视图中使用Razor的Model关键字来访问这个对象 { ViewBag.Title "Index"; } <h2>Index</h2&g…

Android之内核学习笔记

0、Android系统启动 《Android系统启动流程 -- bootloader》 《The Android boot process from power on》 《Android 启动过程介绍》 《Android培训班(86)内核运行之前的引导程序》 这是一系列文章 《Android 分区挂载》 1、init 《深入理解android 卷1》 第3章 深入理解…

能源项目xml文件 -- app-context.xml

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/c…

python列表操作程序_Python列表操作,比较常见的10个问题

列表是比较常用的数据类型之一&#xff0c;本文整理了 StackOverflow 上关于列表操作被访问较多的10个问答&#xff0c;如果你在开发过程中遇到这些问题&#xff0c;不妨先思考一下如何解决。1、迭代列表&#xff0c;如何访问列表下标索引普通版&#xff1a;items [8, 23, 45]…

ViewData 和 ViewBag 到底有什么区别?

咨询区 user469652请问 ASP.NET MVC 中的 ViewBag 和 ViewData 到底哪一个好&#xff0c;在实际项目开发中应该选择哪一个&#xff1f;回答区 Naresh RavlaniViewData它需要对复杂类型进行类型转换并且还要检查null值来防止错误。ViewBag它不需要对 复杂类型 进行类型转换。考虑…