hangfire使用笔记
1、导入nuget包

2、配置


简单配置后就可以写自己的Job了

注意:Hangfire.RecurringJobExtensions这个扩展支持两种job添加方法:json配置文件和特性。但由于时区使用的是string配置,导致Linux上时区不对,所以扩展一下job的加载方法:

如果不希望在一个job还没执行完成的时候再次进入该job,添加如下过滤器:
/// <summary>
/// 每个job都不可重入过滤器
/// </summary>
public class NotReentryServerHangfireFilter : IServerFilter
{
/// <summary>
/// 判断job是否正在运行
/// </summary>
static ConcurrentDictionary<string, DateTime> JobRunnings = new ConcurrentDictionary<string, DateTime>(); ILogger _logger;
public NotReentryServerHangfireFilter(ILogger<NotReentryServerHangfireFilter> logger)
{
_logger = logger;
} public void OnPerforming(PerformingContext filterContext)
{
var jobId = BuildJobId(filterContext.BackgroundJob);
if(!JobRunnings.TryAdd(jobId, DateTime.Now))
{
filterContext.Canceled = true;
return;
}
_logger.LogInformation($"{jobId} starting...");
} public void OnPerformed(PerformedContext filterContext)
{
var jobId = BuildJobId(filterContext.BackgroundJob);
JobRunnings.TryRemove(jobId, out var tmp);
_logger.LogInformation($"{jobId} finished.");
} public string BuildJobId(BackgroundJob job)
{
return $"{job.Job.Type.FullName}.{job.Job.Method.Name}";
}
}


日志:
public class HangfireLoggerProvider : ILogProvider
{
ILoggerFactory _loggerFactory;
public HangfireLoggerProvider(ILoggerFactory loggerFactory)
{
_loggerFactory = loggerFactory;
} public ILog GetLogger(string name)
{
return new HangfireLogger(_loggerFactory.CreateLogger(name));
}
} public class HangfireLogger : ILog
{
ILogger _logger; public HangfireLogger(ILogger logger)
{
_logger = logger;
} public bool Log(Hangfire.Logging.LogLevel logLevel, Func<string> messageFunc, Exception exception = null)
{
var msg = messageFunc?.Invoke();
if (string.IsNullOrWhiteSpace(msg) && exception == null)
return false; switch (logLevel)
{
case Hangfire.Logging.LogLevel.Trace:
_logger.LogTrace(0, exception, msg);
break;
case Hangfire.Logging.LogLevel.Debug:
_logger.LogDebug(0, exception, msg);
break;
case Hangfire.Logging.LogLevel.Info:
_logger.LogInformation(0, exception, msg);
break;
case Hangfire.Logging.LogLevel.Warn:
_logger.LogWarning(0, exception, msg);
break;
case Hangfire.Logging.LogLevel.Error:
_logger.LogError(0, exception, msg);
break;
case Hangfire.Logging.LogLevel.Fatal:
_logger.LogCritical(0, exception, msg);
break;
default:
break;
} return true;
}
}
hangfire使用笔记的更多相关文章
- Hangfire 使用笔记
“巨人们”的地址 Hangfire Mysql: https://github.com/arnoldasgudas/Hangfire.MySqlStorage 在获取set表数据的sql语句有bug ...
- Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务
前言 最近把Python写的数据采集平台往.Net Core上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行,但反正就折 ...
- Hangfire实战二——为DashBoard页面添加权限认证
概述 Hangfire Dashboard为我们提供了可视化的对后台任务进行管理的界面,我们可以直接在这个页面上对定时任务进行删除.立即执行等操作,如下图所示: 默认情况下,这个页面只能在部署Hang ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- ABP文档 - Hangfire 集成
文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
随机推荐
- 转:Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- JavaScrip 入门第一课
一.代码引入的三种方式 1.直接在head中书写 在head标签里面可以写,在body标签里面也可以写,放到head标签里面和放到body标签里面到底有什么区别,我们后续在讲~ <head> ...
- 【Linux基础】crontab定时命令详解
周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“crontab”,是 ...
- socket 如何判断远端服务器的连接状态?连接断开,需重连
fluent-logger-java is a Java library, to record events via Fluentd, from Java application. https://g ...
- 004_浅析Python的GIL和线程安全
在这里我们将介绍Python的GIL和线程安全,希望大家能从中理解Python里的GIL,以及GIL的前世今生. 对于Python的GIL和线程安全很多人不是很了解,通过本文,希望能让大家对Pytho ...
- ORA-19566: exceeded limit of 0 corrupt blocks for file E:\xxxx\<datafilename>.ORA.
How to Format Corrupted Block Not Part of Any Segment (Doc ID 336133.1) To BottomTo Bottom In this D ...
- 数组复制的五种方式(遍历循环一一赋值、System.arraycopy、地址赋值、克隆clone()、Arrays.copyof())
package com.Summer_0424.cn; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayLis ...
- Python脱产8期 Day09 2019/4/23
内存管理 一.引用计数:垃圾回收机制的依据 1.变量的值被引用,该值的引用计数 +12.变量的值被解绑,该值的引用计数 -13.引用计数为0时就会被垃圾回收机制回收 二.引用计数会出现循环引用问题:相 ...
- 后端list集合中的数据传递到前台HTML中显示(表格形式)
关键字:web项目中前后台数据传递问题 在学习web项目的过程中,我们肯定会遇到前后台数据交换问题.这个问题我也思考了很久,今天借此总结一下.由于博主水平有限,如有不当之处,还请大家多多指正,,废话不 ...
- jmeter(二十三)分布式测试
jmeter用了一年多,也断断续续写了一些相关的博客,突然发现没有写过分布式测试的一些东西,这篇博客就介绍下利用jmeter做分布式测试的一些技术点吧,权当参考... 关于jmeter的介绍和元件作用 ...