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,一经查实,立即删除!

相关文章

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

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

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

| 作者&#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…

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

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

Android之用AccessibilityService实现红包插件

微信红包自打出世以来就极其受欢迎,抢红包插件可谓红极一时.今天,我们重新谈谈抢红包插件的哪些事儿.本质上,抢红包插件的原理不难理解,其过程就是在收到红包时,自动模拟点击.做过自动化UI测试的童鞋应该非常熟悉了.那么问题来了,我们怎么知道有没有红包,又怎么模拟点击操作呢?…

【软件周刊】D语言卷土重来,Vue.js 应获 1024 个赞,小薇可以一键启动了

2019独角兽企业重金招聘Python工程师标准>>> 一、 前端相关 1. Vue.js — Vue.js 这次的更新比较频繁&#xff0c;才刚刚更新完 2.0.4 版本不久&#xff0c;立马就更新出了 2.0.5 版本。这次发布的 2.0.4 版本主要的亮点是 SSR 性能改进了 20%&#xff0c;然后接着更…

Autofac实现拦截器和切面编程

Autofac.Annotation框架是我用.netcore写的一个注解式DI框架&#xff0c;基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址&#xff1a;https://github.com/yuzd/Autofac.Annotation上期说了Autofac实现有条件的DI本期讲的是最新…

[探索 .NET 6]01 揭开 ConfigurationManager 的面纱

在这个系列中&#xff0c;我将探索一下 .NET 6 中的一些新特性。已经有很多关于 .NET 6 的内容&#xff0c;包括很多来自 .NET 和 ASP.NET 团队本身的文章。在这个系列中&#xff0c;我将探索一下这些特性背后的一些代码。在这第一篇文章中&#xff0c;来研究一下 Configuratio…

mysql锁表_MySQL中Alter table 你不知道的性能问题

前言&#xff1a;MySQL 的大表运维总是令人头疼的一件事&#xff0c;特别是大表表结构的修改尤为困难。首先&#xff0c;alter table 的process不可被kill &#xff0c; 一旦执行就不可回退。其次&#xff0c;大多数的alter table操作都会涉及 lock --- copy to new table --- …

打印文件前,千万记得把弹窗叉掉!!!

1 父母能有多迷信&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 打印前千万记得把弹窗关掉&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 挺好的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 饭桌上&#xff0c;领导叫你去…

高效的动态URL限流实现

访问限流对于一个网关来说是个比较重要的功能&#xff0c;它可以根据不同服务的处理能力来控制相关的访问量&#xff0c;从而保障服务更可靠地运行。但是URL控制的路径比较多还加上可动态添加删除&#xff0c;大量的访问匹配会很容易引起性能上的问题&#xff0c;接下来讲解一下…

cocos2d-x学习 之一

最近准备学习cocos2d-x的开发&#xff0c;首先要搭建一下开发环境。今天就先搭建一下开发环境。本人系统为Mint-15 64位的linux&#xff0c;以下的开发环境只用于linux。首先到cocos2d-x的官网上下载安装包&#xff0c;由于cocos2d-x是开源的&#xff0c;所以我们可以查看源码&…