NuGet 上有几个可用的Hangfire 的软件包。若是在ASP.NET应用程序中安装HangFire,并使用Sql Server做为存储器,那么请在Package Manager Console窗口中键入如下命令:html
PM> Install-Package Hangfire
在安装package后,添加或者更新如下几行到Owin Startp类:git
using Hangfire; // ... public void Configuration(IAppBuilder app) { GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>"); app.UseHangfireDashboard(); app.UseHangfireServer(); }
须要配置受权
默认状况下,只有本地有权限访问Hangfire仪表板。若是须要受权远程访问,那么仪表板的受权必须进行相应的配置。github
而后打开Hangfire仪表板来测试您的配置。编译项目并在浏览器中打开如下URL:数据库
1
|
http:
//<your-site>/hangfire
|
HangFire处理不一样类型的后台任务,而且使用一个独立的上下文环境调用他们。express
这是一个主要的后台任务类型,持久化消息队列会去处理这个任务。当你建立了一个发布/订阅任务,该任务会被保存到默认队列里面(默认队列是"Default",可是支持使用多队列)。多个专一的工做者(Worker)会监听这个队列,而且从中获取任务而且完成任务。后端
BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
若是想要延迟某些任务的执行,能够是用如下任务。在给定延迟时间后,任务会被排入队列,而且和发布/订阅任务同样执行。浏览器
BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
按照周期性(小时,天等)来调用方法,请使用RecurringJob
类。在复杂的场景,您可使用CRON表达式指定计划时间来处理任务。app
RecurringJob.AddOrUpdate(() => Console.WriteLine("Daily Job"), Cron.Daily);
连续性容许您经过将多个后台任务连接在一块儿来定义复杂的工做流。框架
var id = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, ")); BackgroundJob.ContinueWith(id, () => Console.WriteLine("world!"));
Hangfire将您的任务保存到持久化库汇总,而且以可靠的方式处理它们。这意味着,你能够中断Hangfire Worder的线程,从新加载应用程序域,或者终止程序,即便这样您的任务仍会被处理。只有在你代码的最后一行执行完成,Hangfire才会标记这个任务完成。而且知道任务可能在最后一行代码执行以前失败。它包含多种 自动-重试机制,它能够自动处理在存储或代码执行过程当中发生的错误。异步
这对于通用托管环境(如IIS Server)很是重要。它们能够包含不一样的优化,超时和错误处理代码(可能致使进程终止)来防止很差的事情发生。若是您没有使用可靠的处理和自动机制,您的工做可能会丢失。您的最终用户可能无限期等待某些任务,如电子邮件,报告,通知等。
可是当您的存储空间破损时,Hangfire没法作任何事情。请为您的存储使用不一样的故障切换策略,以保证在发生灾难时处理每一个做业。
原文地址:http://docs.hangfire.io/en/latest/quick-start.html
HangFire简述:
分布式后端做业调度框架服务,咱们只须要关心业务逻辑代码,而不用关心调度机制,支持.net framework和.net core
HangFire基本结构:
客户端(建立任务)、服务端(执行任务)、数据库(存储任务列表和执行情况)、仪表盘(在网站上对任务进行监控查看和各类操做)
HangFire适用场景:
定时执行任务、循环执行任务、异步执行耗时任务、A任务执行完成再执行B任务、批量执行任务
HangFire官网: https://www.hangfire.io/
HangFire中文文档:http://koukouge-hangfire.daoapp.io/quick-start.html
HangFire英文文档:http://docs.hangfire.io/en/latest/quick-start.html
HangFire源码地址: https://github.com/HangfireIO
实战经验分享:
网上资料不是不少 都是按照官方例子在讲解,缺乏不少关键性的概念讲解,致使不少伙计在实战中遇到各类坑。
一、客户端:建立任务-->一、配置HangFire数据库链接 二、建立任务(在建立任务的时候HangFire会自动将任务序列化并存储到数据)
二、服务端:执行任务-->一、配置HangFire数据库链接 二、从HangFire数据库系统表读取客户端建立的任务而后开线程并行执行,任务之间不冲突。(服务端可宿主在Windows服务、控制台程序、IIS中…)
三、数据库:HangFire程序框架表-->建立任务的时候HangFire会自动生成无需关心,但要注意若是采用现有的数据库,必须保证数据库中没有重名的表,不然你懂(aggregatedcounter、counter、distributedlock、hash、job、jobparameter、jobqueue、jobstate、list、server、set、state),数据库可采用 MySQL ,MSSQL,Redis视须要而定
四、仪表盘:展现做业列表执行状态和结果等相关信息-->在.Net WebForm或.Net MVC 或.NetCore MVC网站程序对接HangFire数据库,MVC 对接方式和WebForm略微不一样 请参考官方文档
如何正确理解架设部署上述4个板块:
重点说客户端、服务端、仪表盘直之间的关系,数据库就不用多说了
方案1(不推荐):客户端A、服务端B、仪表盘C 分别运行在3个独立的项目中
优缺点:没什么优势,并且AB分开会致使服务端B从数据库提取任务列表,准备反向加载程序集执行任务的时候,在本身的程序代码中找不到对应的业务逻辑代码或者引用类,由于业务逻辑代码是在客户端A项目中建立,天然业务逻辑类及功能代码都在A项目的程序集中,天然找不到。
例子:客户端A建立的做业是引用YourOwnJobLibrary.dll类中 ShowMeTheMoney() 方法,而服务端B中没有引用YourOwnJobLibrary.dll 因此没法执行任务ShowMeTheMoney(),
解决方案:让服务端B也引用YourOwnJobLibrary.dll便可,可是这并非咱们想要的结果,之后更新服务什么的还得两头更新很麻烦。
方案2(推荐):客户端A、服务端B在同一个项目中,仪表盘C独立网站项目中
优缺点:这样比较合理,更新服务方便,即使没有仪表盘C,做业正常调度执行;适合后台相对固定的做业。
能够将AB放在Windows服务项目中(VS中能够建立),这样系统重启什么的毫无顾虑,更新服务程序的时候只需中止服务->替换程序->开启服务便可。
方案3(还行):客户端A、服务端B、仪表盘C在同一网站项目只能是网站项目,由于仪表盘只能在Web项目(API、WebForm、MVC )中
优缺点:视状况也何尝不可,若是宿主在IIS中,IIS默认20分钟没有人访问会中止,HangFire做业服务也会定制,可将此时间在IIS配置中延长,比较适合任务常常须要灵活变更处理的场景。
重要信息备注:
注1:建立任务能够是在控制台程序Main方法中执行一次把任务Load到数据库,或则在网站上用户点击某个按钮执行后端方法建立。
注2:服务端比较灵活,可宿主在Windows服务、控制台程序、IIS中…
注3:首次启动链接数据库时,会自动生成12张系统表,请确保现有库中不存在如下表名:aggregatedcounter、counter、distributedlock、hash、job、jobparameter、jobqueue、jobstate、list、server、set、state
注4:原则上同一台电脑上只须要1个服务端存在,测试中发现这么一种状况:服务端B宿主在D控制台程序中,因误操做在仪表盘C网站项目中也启动一个HangeFire宿主服务E,最后的结果是服务端B的程序失效,服务端E正常运做,可是仪表盘上显示找不到任务做业对应的程序集,由于程序集在服务端B程序中,如方案1的System.IO.FileNotFoundException…
注5:HangFire执行的任务里面若是涉及到C盘建立文件夹 可能会由于权限问题 建立失败,采用管理员权限运行程序便可建立
实例:按照方案2思路测试
注:控制台程序关闭,也就是HangFire宿主程序中止,做业没法继续执行,想检测服务做业是否在执行,可定时往记事本中写入当前时间。
五、网站(.net core)中配置HangFire仪表盘:( .net framework 的网站配置不同 还没有测试)
注1:app.UseHangfireDashboard(); 是让网站仅仅能够访问HangFire数据库的做业详情,不负责业务代码的执行。
注2:app.UseHangfireServer();是让HangFire服务宿主在Web程序中,参加上面方案2和方案3,若是是方案2则不该该添加此语句,方案3则添加此语句。
运行项目访问HangFire仪表盘: http://localhost:56013/hangfire/