做网站用的主机多少合适,WordPress阿里云安装,手把手教建设网站,网站建设专业导航网站一.简述
Hangfire作为一款高人气且容易上手的分布式后台执行服务#xff0c;支持多种数据库。在.net core的环境中#xff0c;由Core自带的DI管理着生命周期#xff0c;免去了在NF4.X环境中配置always running的麻烦#xff0c;真正做到开箱即用。
二.安装
Hangfie官方支…一.简述
Hangfire作为一款高人气且容易上手的分布式后台执行服务支持多种数据库。在.net core的环境中由Core自带的DI管理着生命周期免去了在NF4.X环境中配置always running的麻烦真正做到开箱即用。
二.安装
Hangfie官方支持是MsSql和redis除此之外可供选择的还有PostgreSql和Mongo。在应用入口项目需要引用Hangfire.AspNetCore和特定持久库比如使用了MsSql数据库的Hangfire.SqlServer。而在其他项目比如bll层的项目只需引用基础的Hangfire.Core就可以了。
三.Startup配置
1.注入Hnagfire服务
services.AddHangfire(x x.UseSqlServerStorage(connection string));
2.可选配置
启动Hangfire服务和对应的web面板如下 app.UseHangfireServer();//启动Hangfire服务 app.UseHangfireDashboard();//启动hangfire面板
细心的观众可能会发现这两个方法都有可选参数可以提供更多的配置。
2.1 配置任务属性
var jobOptions new BackgroundJobServerOptions { Queues new[] { test,default },//队列名称只能为小写 WorkerCount Environment.ProcessorCount * 5, //并发任务数 ServerNamehangfire1,//服务器名称 }; app.UseHangfireServer(jobOptions);
Queues 要处理的队列列表对于有多个服务器同时连接到数据库Hangfire会认为他们是分布式中的一份子。现实中不同服务器往往存在着差异这个时候就需要合理配置服务器(应用)的处理队列举两个例子1.对于服务器性能差异的处理有100个A任务和50个B任务需要处理假设A服务器的性能是B服务器的两倍如果不配置队列那么会平分任务给两个服务器。如果我们只让B服务器处理B任务而A服务器同时处理两种任务这样B就能减少一些压力。
2.对于服务器能力差异的处理假设A服务器能处理A和B两种任务B服务器只能处理B任务没有处理A任务的方法或对象如果不配置队列默认会让B也执行A任务从而产生错误。反面一想如果A服务器和B服务器都有共同的接口B服务器不实现接口的方法发起一个专属于A服务器队列的任务而A服务器通过注入实现接口的方法可以达到传递任务的效果。
WorkerCount 并发任务数超出并发数将等待之前的任务完成默认的并发任务数是线程cpu的5倍如果IO密集型任务多而CPU密集型的任务少可以考虑调高并发任务数。
以上是我用到的当然还有其他配置参数等着你去开发。
2.2.配置访问权限
在实际生产中我们可能不希望任何人都可以访问面板或暂停执行某些任务这时就需要重写面板的权限了。默认情况下只有本地访问权限才能使用Hangfire仪表板。所以需要重写控制面板以便远程访问。 var options new DashboardOptions { Authorization new[] { new HangfireAuthorizationFilter() } }; app.UseHangfireDashboard(/hangfire, options);
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { //这里需要配置权限规则 public bool Authorize(DashboardContext context) { return true; } }
三.使用(文档) frameborder0 scrollingno styleborder-width: initial; border-style: none; width: 701px; height: 482px;
任务类型
Fire-and-forget 直接将任务加入到待执行任务队列Delayed 在当前时间后的某个时间将任务加入到待执行任务队列Recurring 周期性任务每一个周期就将任务加入到待执行任务队列Continuations 顾名思义继续执行任务
1.简单入门
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.EnqueueSomeClass(i i.SomeMethod(someParams))
2.进阶功能
2.1设置任务队列
[Queue(test)]public void TestQueue() { }
对于非周期任务只需要在执行的方法添加Queue的特性就能指定该任务让特定的队列服务器处理。而周期任务则需要先声明
RecurringJob.AddOrUpdate(() Console.WriteLine(Recurring!),Cron.Daily,queue:test);
2.2 使用日志过滤器(点我查看)
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
相关文章
ASP.NET 执行后台任务的利器——HangfireHangfire项目实践分享
原文地址 http://www.cnblogs.com/chenug/p/6655636.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注