Hangfire做为一款高人气且容易上手的分布式后台执行服务,支持多种数据库。在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always running的麻烦,真正作到开箱即用。javascript
Hangfie官方支持是MsSql和redis,除此以外,可供选择的还有PostgreSql和Mongo。
在应用入口项目须要引用Hangfire.AspNetCore和特定持久库,好比使用了MsSql数据库的Hangfire.SqlServer。
而在其余项目(好比bll层的项目),只需引用基础的Hangfire.Core就能够了。html
services.AddHangfire(x => x.UseSqlServerStorage("<connection string>"));
启动Hangfire服务和对应的web面板以下:java
app.UseHangfireServer();//启动Hangfire服务 app.UseHangfireDashboard();//启动hangfire面板
细心的观众可能会发现,这两个方法都有可选参数,能够提供更多的配置。git
var jobOptions = new BackgroundJobServerOptions { Queues = new[] { "test","default" },//队列名称,只能为小写 WorkerCount = Environment.ProcessorCount * 5, //并发任务数 ServerName="hangfire1",//服务器名称 }; app.UseHangfireServer(jobOptions);
Queues
要处理的队列列表
对于有多个服务器同时链接到数据库,Hangfire会认为他们是分布式中的一份子。现实中不一样服务器每每存在着差别,这个时候就须要合理配置服务器(应用)的处理队列,举两个例子:
1.对于服务器性能差别的处理,有100个A任务和50个B任务须要处理,假设A服务器的性能是B服务器的两倍,若是不配置队列,那么会平分任务给两个服务器。若是咱们只让B服务器处理B任务,而A服务器同时处理两种任务,这样B就能减小一些压力。github
2.对于服务器能力差别的处理,假设A服务器能处理A和B两种任务,B服务器只能处理B任务(没有处理A任务的方法或对象),若是不配置队列,默认会让B也执行A任务,从而产生错误。反面一想,若是A服务器和B服务器都有共同的接口,B服务器不实现接口的方法,发起一个专属于A服务器队列的任务,而A服务器经过注入实现接口的方法,能够达到传递任务的效果。web
WorkerCount
并发任务数,超出并发数将等待以前的任务完成
默认的并发任务数是线程(cpu)的5倍,若是IO密集型任务多而CPU密集型的任务少,能够考虑调高并发任务数。redis
以上是我用到的,固然还有其余配置参数等着你去开发。docker
在实际生产中,咱们可能不但愿任何人均可以访问面板,或暂停执行某些任务,这时就须要重写面板的权限了。默认状况下,只有本地访问权限才能使用Hangfire仪表板。因此须要重写控制面板,以便远程访问。数据库
var options = new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } }; app.UseHangfireDashboard("/hangfire", options);
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { //这里须要配置权限规则 public bool Authorize(DashboardContext context) { return true; } }
Fire-and-forget
直接将任务加入到待执行任务队列Delayed
在当前时间后的某个时间将任务加入到待执行任务队列Recurring
周期性任务,每个周期就将任务加入到待执行任务队列Continuations
顾名思义,继续执行任务服务器
using (var connection = JobStorage.Current.GetConnection()) { var storageConnection = connection as JobStorageConnection; if (storageConnection != null) { //当即启动 var jobId = BackgroundJob.Enqueue(()=>Console.WriteLine("Fire-and-forget!")); } }
固然,不单单只有静态方法能够执行,Hangfire的任务也是支持.net core的依赖注入的,会构造一个对象并执行对应的方法。
BackgroundJob.Enqueue<SomeClass>(i => i.SomeMethod(someParams))
[Queue("test")] public void TestQueue() { }
对于非周期任务,只须要在执行的方法添加Queue的特性就能指定该任务让特定的队列服务器处理。
而周期任务,则须要先声明:
RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"),Cron.Daily,queue:"test");
Hangfire支持自定义过滤器,能够对任务在建立时、执行中、执行后等等状态执行特定特定的操做。
//特定方法过滤器 [LogEverything] public static void Send() { } //全局过滤器 GlobalJobFilters.Filters.Add(new LogEverythingAttribute());
hangfire是一个不错的开源后台任务组件,官方没有中文文档,因此简单地用谷歌机翻修改了一下。
文档在github的地址:https://github.com/jonechenug/Hangfire-Chinese-Doc
docker运行并访问本地8080端口:
docker run --restart always --name hangfire -d -p 8080:80 daocloud.io/koukouge/hangfirezhdoc