Hangfire 在asp.net core环境的使用
hf被定义为分布式后台服务,更加类似job作业的服务
做作业的插件有quartz.net,JobScheduler 等
当然,都有一些分别和适用的场景。
1.安装
需要安装
Hangfire.Core
Hangfire.AspNetCore
Hangfire.SqlServer
关于数据库存储工具,可以根据场景去选择安装
例如mysql 的,需要安装 Hangfire.MySql (mysql很多第三方写,所以使用时主要使用环境)
Redis放入 Hangfire.Redis
redis是官方作者去更新,所以这些使用可以直接看官网
2.配置
asp.net core主要是startup配置DI组件。
官网也有说,列举一下
// Add Hangfire services.
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(Configuration.GetConnectionString("default"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
})); services.AddHangfireServer();
关键是这个链如何配,UseSqlServerStorage专门读取hangfire会写入哪个数据库,如果用现在的业务数据库,hangfire的表会写进去的,也可以设计分开来存放,例如hangfire的DB,集中去管理。当然一般小的项目,直接跟业务数据库,集中而独立的架构。
Configure里面的配置
var jobOptions = new BackgroundJobServerOptions
{
Queues = new[] { "back", "front", "default" },//队列名称,只能为小写
WorkerCount = Environment.ProcessorCount * , //并发任务数
ServerName = "conference hangfire1",//服务器名称
}; app.UseHangfireServer(jobOptions);//启动Hangfire服务 app.UseHangfireDashboard();//启动hangfire面板
backgroundJobs.Enqueue(() => Console.WriteLine("Hangfire 服务器已启动")); app.UserHangfireAdminService(service); //这个是自己写的服务扩展
jobOptions如果不配置,会有自己默认的名称,例如服务器会读取你当前系统的名称,队列那些会读取对应服务器的程序集名称。
3.写服务
完成了第一二步,这里看这个作业如何写
public static class HangfireAdminService
{
private static BackgroundJobServer _server; /// <summary>
/// 使用后台作业
/// </summary>
/// <param name="app"></param>
/// <param name="service"></param>
/// <param name="client"></param>
/// <returns></returns>
public static IApplicationBuilder UserHangfireAdminService(this IApplicationBuilder app,
IConferenceService service)
{
var mcfg = service.MailConfigDefault();
BackgroundJob.Enqueue(() => Console.WriteLine($"测试单个作业: {DateTime.Now}"));
RecurringJob.AddOrUpdate(
() =>
Console.WriteLine($"测试循环作业: {DateTime.Now}"), Cron.Minutely
); BackgroundJob.Schedule(() => Console.WriteLine($"测试延迟作业: {DateTime.Now}"), TimeSpan.FromMinutes()); return app;
}
}
这个是刚才configure里面的方法。 可以写成一个IApplicationBuilder的扩展方法,加进管道
这样服务器启动时,就会启动里面的服务。
如果Job作业需要调用一个后台服务,就不能直接在里面_service.Log这样去调用方法了,因为处于不同的线程方式。所以job调后台,可以这样操作
举例,这是个api发邮件的方法
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="mail"></param>
[HttpPost]
[Route("SendPwd")]
public MsgResult<bool> SendPwd(MailConfigDto mail)
{
MsgResult<bool> result = new MsgResult<bool>(ResultCode.Success);
UserAccountDto user = null;
try
{
MailConfigDto defaultMail = _service.MailConfigDefault(); user = _service.UserDtoById(mail.ExtensionId);
defaultMail.Body = $"用户注册成功!登录名是:{user.UserName},登录密码是:{user.Password},注册类型是:{user.CustomerProfileName}";
defaultMail.Subject = $"用户:{user.Name}注册成功!";
List<KeyValuePair<string, string>> To = new List<KeyValuePair<string, string>>() {
new KeyValuePair<string, string>(user.Name,user.Email)
};
defaultMail.To = To;
SendEmail(defaultMail);
BackgroundJob.Enqueue<IConferenceService>((s) =>
s.LogAdd("注册成功", $"用户{user.Name}注册成功,已发送邮件", OPLog.AdminLogin)
);
}
catch (Exception ex)
{
result = new MsgResult<bool>(ResultCode.Exception, ex.Message);
} return result; }
关键点, BackgroundJob.Enqueue<IConferenceService>((s) =>s.LogAdd());
Enqueue有个泛型的重载,这里等于是依赖注入的方式,因为在全局autofac配置过
IConferenceService是指向ConferenceService服务的,所以这里注入了Enqueue<IConferenceService>接口,只能是接口,才可以让DI生效。
so, s.LogAdd代表了接口里面的方法。这样Enqueue里面就可以调用后台自定义的服务了
4.总结,当然还有很多细节没谈,不过这样基本的配置和使用,已经满足软件的日常用途了。
补充一点,常用的三种方式的特点,
立即执行,完事后会自动销毁,当然,失败了按默认的1分钟后会重新尝试,直到成功了
延迟执行,这个等于制定了计划的执行时间,这里最少时间是按分钟算,所以这里不能按用秒甚至毫秒做计算时间的任务。
循环执行,循环执行独立一个方法 RecurringJob。如果大类分,前2个是一个后台作业类,这个独立的类。循环执行某次进程如果失败了,也不会影响整体的循环效果,只是失败的进程也会按总体的规则,1分钟后重新尝试失败的进程。
当然还有其他的,例如批量处理,延续,批量延续等
Hangfire 在asp.net core环境的使用的更多相关文章
- 在Linux(Ubuntu)下搭建ASP.NET Core环境并运行 继续跨平台
最新教程:http://www.cnblogs.com/linezero/p/aspnetcoreubuntu.html 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环 ...
- ASP.NET Core环境并运行 继续跨平台
ASP.NET Core环境并运行 继续跨平台 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环境 继续.NET跨平台 上一篇:使用VS Code开发ASP.NET Co ...
- Hangfire在ASP.NET CORE中的简单实现
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
- Hangfire在ASP.NET CORE中的简单实现方法
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
- 【转】asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境 ...
- Centos环境下搭建Asp.NET Core环境和安装Jexus
.NET Core2.0出来以后,很多公司开始用于实践生产,其中的原因想必大家都明白,最主要的一下几点. 跨平台,能够部署在Linux和Docker容器中 性能优越,测试时Node的20倍左右 ...
- 快速搭建CentOS+ASP.NET Core环境支持WebSocket
环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...
- Asp.net core 环境配置
参考: 在 ASP.NET Core 中使用多个环境 ASP.NET Core 中的配置 在项目的 Properties\launchSettings.json中可以配置多个环境 { "ii ...
- Linux(Ubuntu)下搭建ASP.NET Core环境
今天来学习一下ASP.NET Core 运行在Ubuntu中.无需安装mono . 环境 Ubuntu 14.04.4 LTS 服务器版 全新安装系统. 下载地址:http://mirrors.neu ...
随机推荐
- vim配置clojure开发环境备忘录
1 需要使用的插件 vundle 使用教程 http://www.cnblogs.com/respawn/archive/2012/08/21/2649483.html vim-fireplace h ...
- 九度oj题目1511:从尾到头打印链表
题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:6010 解决:1805 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包 ...
- Linux内存管理机制简析
Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...
- 分页存储过程ROW_NUMBER() over(order by pid desc)
分页存储过程 : create proc usp_GetMyPhotos @pageIndex int, --当前页码 @pageSize int, --每页多少条 @pageCount ...
- Jmeter压力测试入门操作
Jmeter压力测试入门 1. 前言 Jmeter 是Apache组织开发的基于Java的压力测试工具,开源并且支持多个操作系统,是一款很好的HTTP测试工具.本篇文章主要的目的是帮助没有接触过J ...
- Objective C 中的nil,Nil,NULL和NSNull理解
kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...
- 如何才能快速入门python3?
一些朋友自学python过程中,发现书也能看懂,书上的玩具代码也能看懂,但为啥自己不能做习题,不能写代码解决问题,自己不能动手写代码? 原因是初学者没有学会计算思维.解决问题的方法.编程思路. 编程思 ...
- cordova 开发 android app 简要流程
1. 安装cordova:npm install -g cordova --registry=https://registry.npm.taobao.org 2. 创建cordova工程:进入工作目录 ...
- Ubuntu(Debian)apt-get
Ubuntu(Debian)的aptitude与apt-get的区别和联系 最近在使用Puppet快速部署Openstack,看到一些没见过的工具,例如aptitude,在Ubuntu上有强大的a ...
- Siebel 开发规范
Siebel Configuration and Development Guideline 1 2 2.1 2.2 2.3 11. 2.4 2.5 3 3.1 3.2 3.2.1 3.2.2 3.3 ...