NET定时任务组件Hangfire
开源的.NET定时任务组件Hangfire解析
项目慢慢就要开工了,很多园友都在问这个事情,看来大伙对这事很上心啊,事情需要一步步的来,尽量写出一个我们都满意的项目。以前每次在博客前面都会扯淡一下,不过很多人都抱怨这样做不好,加上我这人扯淡起来就停不住,有时候还会很感性的说出一些话,所以以后写博文尽量少扯淡。(如果博文有不足之处,还望多多指正,我也会及时的修改,如果只是单纯的刷存在感,说一些过激的话,那我就不怎么高兴了)
项目中很多时候都会使用到定时任务这样一个功能需求,在.NET中对于完成定时任务的技术还是不怎么多的,.NET Framework具有“内置”定时器功能,通过System.Timers.Timer类。在使用Timer类需要面对的问题:计时器没有持久化机制;计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等);计时器不使用线程池(每个定时器一个线程);计时器没有真正的管理方案 - 你必须编写自己的机制,以便能够记住,组织和检索任务的名称等。如果需要在.NET实现定时器的功能,可以尝试使用以下这款开源免费的组件Quartz.Net组件。
上面介绍了两种方式,在这里就介绍另外一种组件,那就是Hangfire组件。
一.Hangfire组件概述
在.NET和.NET Core应用程序中执行后台处理的简单方法。无需Windows服务或单独的进程。由持久存储支持,存储方式有sqlserver、redis,mongodb等等。Hangfire支持所有类型的后台任务 - 短时间运行和长时间运行,CPU密集型和I / O密集型,一次性和周期性。
1.组件特点:
2.组件功能:
上面是对Hangfire组件背景的一些简单介绍,下面我们具体来了解一下Hangfire组件的使用方法。
二.Hangfire组件使用方法介绍
既然想要学习了解一个组件,当然需要知道是怎么样取使用,如果不能使用,学着也没有什么很大的用处,下面介绍一下Hangfire组件的一些常用方法。
1.ASP.NET MVC设置方式:

public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>");
app.UseHangfireDashboard();
app.UseHangfireServer();
}

GlobalConfiguration
类是配置Hangfire的首选方式。这是一些方法的入口点,包括来自第三方存储实现或其他扩展的方法。用法很简单,只需Hangfire
在应用程序初始化类中包含命名空间,并发现GlobalConfiguration.Configuration
属性的扩展方法
2.控制台设置方式:
GlobalConfiguration.Configuration
.UseColouredConsoleLogProvider()
.UseSqlServerStorage(@"Server=.\sqlexpress;Database=Hangfire.Sample;Trusted_Connection=True;")
.UseMsmqQueues(@".\Private$\hangfire{0}", "default", "critical");
3.基于队列的任务处理:
var jobId = BackgroundJob.Enqueue(
() => Console.WriteLine("Fire-and-forget!"));
4.延迟任务执行:
var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
5.循环任务执行:
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Recurring!"),
Cron.Daily);
6.继续在其父作业完成时执行:
BackgroundJob.ContinueWith(
jobId,
() => Console.WriteLine("Continuation!"));
7.批处理方法:
var batchId = BatchJob.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});
8.当父批次中的所有后台作业完成时,批处理继续:
BatchJob.ContinueWith(batchId, x =>
{
x.Enqueue(() => Console.WriteLine("Last Job"));
});
9.使用IoC容器:

public class ContainerJobActivator : JobActivator
{
private IContainer _container ;
public ContainerJobActivator (IContainer container )
{
_container = container ;
}}
public override object ActivateJob (Type type )
{
return _container 。Resolve (type );
}
}

在启动Hangfire服务器之前将其注册为当前作业启动器。
var container = new Container();
GlobalConfiguration.Configuration.UseActivator(new ContainerJobActivator(container));
...
app.UseHangfireServer();
Hangfire将作业保存到持久存储中,并以可靠的方式处理它们。这意味着你可以中止Hangfire工作线程,卸载应用程序域甚至终止进程,工作将被处理。Hangfire将作业标记为已完成,只有当代码的最后一行执行,并知道作业可能会失败,最后一行。它包含不同的自动重试功能,可以处理代码中的存储错误或错误。
三.Hangfire组件核心对象解析
上面介绍了Hangfire组件的常用方法,Hangfire组件的功能非常多,这里就做介绍了,有兴趣可以去官网进行查看api。下面介绍一下Hangfire组件的一些核心对象,初探Hangfire组件深层次的问题。
1.RecurringJob.AddOrUpdate():

public static void AddOrUpdate(
Expression<Action> methodCall,
string cronExpression,
TimeZoneInfo timeZone = null,
string queue = EnqueuedState.DefaultQueue)
{
var job = Job.FromExpression(methodCall);
var id = GetRecurringJobId(job); Instance.Value.AddOrUpdate(id, job, cronExpression, timeZone ?? TimeZoneInfo.Utc, queue);
}

该方法用于定期作业在指定的CRON计划上触发多次。该方法具有16个重载,Job.FromExpression(methodCall);用于获取基于Job类的新实例给定的方法调用的表达式树。GetRecurringJobId(job)方法根据Job对象获取对应的JobID。
2.BackgroundJob.Enqueue():
public static string Enqueue([NotNull, InstantHandle] Expression<Action> methodCall)
{
var client = ClientFactory();
return client.Enqueue(methodCall);
}
该方法基于给定的方法调用表达式创建一个新的fire-and-forget作业。该方法接受一个参数,表示将被编组到服务器的方法调用表达式。接下来我们看一下var client = ClientFactory();方法的具体实现

internal static Func<IBackgroundJobClient> ClientFactory
{
get
{
lock (ClientFactoryLock)
{
return _clientFactory ?? DefaultFactory;
}
}
set
{
lock (ClientFactoryLock)
{
_clientFactory = value;
}
}
}

该属性定义了一个Func<IBackgroundJobClient>的泛型委托。该属性是一个可读可写的操作,对ClientFactoryLock加锁,确保不发生死锁情况。
四.总结
上面简单的介绍了Hangfire组件的背景和一些简单的应用,也着重的介绍了一些对象。这个组件的功能很强大,需要了解的地方也较多,这一篇文章不可能全部介绍,用做抛砖引玉的作用。在这里吐槽一句,微软最近技术发展太快,很多技术还没有来得及发展,就有新的技术出来,让我们这些底层的人着实难受,事物发展有规律,不是以前缺的东西可以在很短的时间就可以补上,还是需要留下足够的空间。
NET定时任务组件Hangfire的更多相关文章
- 开源的.NET定时任务组件Hangfire解析
项目慢慢就要开工了,很多园友都在问这个事情,看来大伙对这事很上心啊,事情需要一步步的来,尽量写出一个我们都满意的项目.以前每次在博客前面都会扯淡一下,不过很多人都抱怨这样做不好,加上我这人扯淡起来就停 ...
- C#定时任务组件之FluentScheduler
FluentScheduler是.NET开源处理定时任务组件 1.任务的创建注册 public static void TaskActionByMinutes(Action action, int c ...
- Core 定时任务之HangFire
ASP.NET Core 使用 Hangfire 很简单,首先,Nuget 安装程序包 > install-package Hangfire -pre 然后ConfigureServices添加 ...
- 【框架学习与探究之定时器--Hangfire】
声明 本文欢迎转载,请注明文章原始出处:http://www.cnblogs.com/DjlNet/p/7603632.html 前言 在上篇文章当中我们知道关于Quartz.NET的一些情况,其实博 ...
- 集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce
今天一大早来看到园友分享的福利<分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi>,我也来分享一个吧.以下内容由笔者写 ...
- ASP.NET Core 使用 Hangfire 定时任务
定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...
- .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件
常用的定时任务组件有 Quartz.Net 和 Hangfire 两种,这两种是使用人数比较多的定时任务组件,个人以前也是使用的 Hangfire ,慢慢的发现自己想要的其实只是一个能够根据 Cron ...
- Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务
前言 最近把Python写的数据采集平台往.Net Core上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行,但反正就折 ...
- .NET Core 实现后台任务(定时任务)Longbow.Tasks 组件(三)
原文链接:https://www.cnblogs.com/ysmc/p/16512309.html 在上两篇文章中,简单介绍了怎么使用 IHostedService 与 BackgroundServi ...
随机推荐
- linux、windows搭建nginx出现问题集锦
1.启动提示端口被占用(linux) 启动ninx出现nginx: [emerg] bind() to0.0.0.0:80 failed (98: Address already in use) ne ...
- word 里面没输入法
文件,选项,高级,输入法控制处于活动状态 ,有勾选就去掉,无勾选就勾上,确定后重开word即可
- 简易处理图片在div中居中铺满
原文地址:http://www.cnblogs.com/JimmyBright/p/7681089.html 经常需要在一个长宽固定的div里存放一个图片,这个图片长宽未知,所以需要图片自适应div显 ...
- 剖析Hadoop和Spark的Shuffle过程差异(一)
一.前言 对于基于MapReduce编程范式的分布式计算来说,本质上而言,就是在计算数据的交.并.差.聚合.排序等过程.而分布式计算分而治之的思想,让每个节点只计算部分数据,也就是只处理一个分片,那么 ...
- luogu1084 [NOIp2012]疫情控制 (二分答案+倍增+dfs序)
先二分出一个时间,把每个军队倍增往上跳到不能再跳 然后如果它能到1号点,就记下来它跳到1号点后剩余的时间:如果不能,就让它就地扎根,记一记它覆盖了哪些叶节点(我在这里用了dfs序+差分,其实直接dfs ...
- 【bzoj3160】 万径人踪灭
http://www.lydsy.com/JudgeOnline/problem.php?id=3160 (题目链接) 题意 给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数. Solu ...
- 解题:JSOI 2011 柠檬
题面 显然分出来的每段两端颜色相同,否则把一边归给旁边的答案不变劣,于是可以$O(n^2)$地dp了:设$dp[i]$表示到第$i$个位置为止的最优解,$dp[i]=dp[j]+a[i]*(s[j]- ...
- 模拟QQ聊天与视频聊天同时进行-------java基础知识总结
前言:多线程的知识 代码: package com.day13.math; /** * 类说明 :模拟QQ聊天与视频聊天同时进行 * @author 作者 : chenyanlong * @versi ...
- 搜索引擎:Elasticsearch与Solr
搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分 ...
- git push --set-upstream
我在本地建了一个分支wangxiao,开发完之后,提交代码 git add .git commit -m '注释'git push 出现下面的问题,这个意思是:当前分支没有与远程分支关联. 因此导致了 ...