.NET Core开源组件:后台任务利器之Hangfire
一.简述
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, //并发任务数
ServerName="hangfire1",//服务器名称
};
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;
}
}
三.使用(官方文档)
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.Enqueue<SomeClass>(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
.NET Core开源组件:后台任务利器之Hangfire的更多相关文章
- .NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html
.NET Core开源组件:后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的D ...
- 后台任务利器之Hangfire
后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...
- net5 中 后台任务利器之Hangfire 的使用
什么是Hangfire Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core.它最大特点在于内置提供集成化的控制台,方便后台查看及监控: 另外,Hangfire ...
- Net Core开源通讯组件 SmartRoute
Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...
- Magicodes.Admin.Core开源框架总体介绍
框架说明 Magicodes.Admin.Core框架在ABP以及ASP.NET ZERO的基础上进行了封装和完善,目前基于.NET Core 2.0+(Framework版本),由于部分组件在.NE ...
- Github上优秀的.NET Core开源项目的集合
内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:https://github.com/jasonhua95/ ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- BeetleX高性能通讯开源组件
net core高性能通讯开源组件BeetleX https://www.cnblogs.com/smark/p/9617682.html BeetleX beetleX是基于dotnet core实 ...
- Android开发利器之ActivityTracker
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracke ...
随机推荐
- 网站SEO,HTTP请求的关键数字----6
客户端浏览器向服务器请求一个网页素材. 那么网页素材是通过什么方式,什么顺序被下载下来的呢. 我今天做了个简单的测试. 首先,准备测试文件 写一个网页,网页中引用若干的资源文件. 同一文件的不同的参数 ...
- 税号输入框 将input框中的输入自动转化成半角大写
这两天出了这么一个需求,输入税号的时候,需要自动将其转化为半角大写,并且阻止标点符号中文汉字的输入.(下面会有:全半角转换.文本框选中.光标位置判断.设置光标位置 这些内容) 然后我就开始了慢慢查找资 ...
- Linux学习笔记(1)
一.介绍 Linux系统作为服务器操作器的两大优点是其稳定性以及安全性:常见的Linux系统有以下几种: Debian(1993年下半年出的Linux分支) Ubuntu(目前互联网公司使用的比较多的 ...
- Java集合框架之三:HashMap源码解析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集合模型我们有必要弄清楚它的使用方法和它底层的实 ...
- 自己写的python脚本(抄的别人的,自己改了改,用于整理大量txt数据并插入到数据库)
昨天,遇到了一个问题,有100w条弱口令数据,需要插入到数据库中,而且保存格式为txt. 身为程序员不可能一条一条的去写sql语句吧(主要是工作量太大,我也懒得干).所以,我 就百度了一下,看有没有相 ...
- ASP.NET MVC 导出Word报表
最近要做MVC导出Word报表功能.查了查资料发现一个好用的插件就是Aspose.Word.这个插件也很有名气,也很好用. 1.首先就是引用该插件 2.填充Word模版 3.后台操作 private ...
- jsp判断为空用not empty
试过 !='' 不管用,只好百度,现在知道了 <c:if test="${not empty pos.requireDegreeName }"> ${pos.requi ...
- js中盒子模型常用的属性你还记得几个?
//clientWidth;//内容宽度Width+左右填充padding//clientHeight;//内容高度height+上下填充padding//clientLeft;//左边框的宽度相当于 ...
- Sass使用小技巧
1.任何可以用作css属性值的赋值都可以用作sass变量值.如果变量值与属性不匹配,sass会当作普通字符串来处理. $family: "microsoft yahei", Ari ...
- Node.js web快速入门 -- KoaHub.js组件koa-static-server
koa-static-server Static file serving middleware for koa with directory, rewrite and index support k ...