.net Framework 4.6 WebAPI 使用Hangfire

或与且与或非 2024-10-10 10:33:01 阅读 65

C# 使用 Hangfire

第一章 .net Framework 4.6 WebAPI 使用Hangfire


文章目录

C# 使用 Hangfire

前言

一、hangfire是什么?

二、hangfire的特点

三、.net Framework 中hangfire的使用方法

第一步:创建WebAPI控制器

第二步:添加nuget包

第三步 创建startup类

新建项目startup类

Startup类中具体的实现

第四步:创建动态添加Job的WebApi

接口返回类型model

业务执行帮助方法

对外接口会用到的dll

创建对外接口

第五步:

无参业务接口

有参业务接口

Get请求

控制面板参数配置

后端接口配置

POST请求

控制面板参数配置

后端接口接收参数配置

第六步:控制面板手动添加周期性作业

访问hangfire控制面板

添加周期性作业参数说明

第七步:查看执行结果

执行成功效果图

执行失败效果图

任务回调校验失败错误

业务接口请求出现错误

业务接口请求超时

总结


前言

在业务中常常遇到需要在后台定时执行的业务,例如:库存同步、数据定时推送拉取等,目前较为成熟的定时任务插件主要有hangfire,Quartz;这里我们就选择hangfire,选择它的原因主要是因为它自带了控制面板,单它也有缺点它不支持秒级定时。这里举例的业务主要是做库存同步,不需要精确到秒级。下面咱们就来看看怎么实现吧。


一、hangfire是什么?

Hangfire 是一个开源且商业免费使用的工具函数库。可以让你非常容易地在 ASP.NET 应用(也可以不在 ASP.NET 应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于 Windows Service 后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台

二、hangfire的特点

支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:BackgroundJob.Enqueue (() => Console.WriteLine (“Simple!”));

延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行。使用方法:BackgroundJob.Schedule (() => Console.WriteLine (“Reliable!”), TimeSpan.FromDays (7));

循环任务执行:只需要简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于 CRON 表达式来设定复杂的模式。使用方法:RecurringJob.AddOrUpdate (() => Console.WriteLine (“Transparent!”), Cron.Daily);

持久化保存任务、队列、统计信息:默认使用 SQL Server,也可以配合消息队列来降低队列处理延迟,或配置使用 Redis 来获得更好的性能表现

内置自动重试机制:可以设定重试次数,还可以手动在控制台重启任务

除了调用静态方法外还支持实例方法

能够捕获多语言状态:即可以把调用者的 Thread.CurrentCulture 和 Thread.CurrentUICulture 信息同任务持久保存在一起,以便任务执行的时候多语言信息是一致的

支持任务取消:使用 CancellationToken 这样的机制来处理任务取消逻辑

支持 IoC 容器:目前支持 Ninject 和 Autofac 比较常用的开源 IoC 容器

支持 Web 集群:可以在一台或多台机器上运行多个 Hangfire 实例以便实现冗余备份

支持多队列:同一个 Hangfire 实例可以支持多个队列,以便更好的控制任务的执行方式

并发级别的控制:默认是处理器数量的 5 倍工作行程,当然也可以自己设定

具备很好的扩展性:有很多扩展点来控制持久存储方式、IoC 容器支持等

三、.net Framework 中hangfire的使用方法

第一步:创建WebAPI控制器

在这里插入图片描述

在这里插入图片描述

第二步:添加nuget包

<code>这里需要注意的是我使用的是1.8.3,目前最新版是1.8.14,最新版使用中文的时候会有点问题导致控制面单无法展示中文。

在这里插入图片描述

第三步 创建startup类

新建项目startup类

具体步骤如下:

1、右键项目

2、添加

3、新建项目

4、选择OWIN Startup类

在这里插入图片描述

Startup类中具体的实现

这里需要注意的是:

代码中zh-CN处是将控制面板设置为中文的方法,此方法在1.8.14中设置是没有效果的,具体原因不得而知。

<code>public class Startup

{

public void Configuration(IAppBuilder app)

{

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");

GlobalConfiguration.Configuration

.UseLog4NetLogProvider()

.UseDefaultCulture(new CultureInfo("zh-CN"))

.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)

.UseSimpleAssemblyNameTypeSerializer()

.UseRecommendedSerializerSettings()

.UseSqlServerStorage(数据库连接字符串, new SqlServerStorageOptions

{

QueuePollInterval = TimeSpan.FromSeconds(15),

JobExpirationCheckInterval = TimeSpan.FromHours(1),

CountersAggregateInterval = TimeSpan.FromMinutes(5),

PrepareSchemaIfNecessary = true,

DashboardJobListLimit = 50000,

TransactionTimeout = TimeSpan.FromMinutes(1)

//TablesPrefix = "Hangfire"

}).UseHangfireHttpJob();

app.UseHangfireDashboard();//配置后台仪表盘

app.UseHangfireServer();//开始使用Hangfire服务

}

}

第四步:创建动态添加Job的WebApi

接口返回类型model

public class ResponseDTO

{

public bool Status {

get; set; }

public string Message {

get; set; }

}

业务执行帮助方法

private ResponseDTO Excute(Hangfire.HttpJob.Server.HttpJobItem httpJob)

{

ResponseDTO rspModel = new ResponseDTO();

try

{

using (var client = new HttpClient())

{

if (httpJob.Headers != null && httpJob.Headers.Count > 0)

{

foreach (var HeaderInfo in httpJob.Headers)

{

client.DefaultRequestHeaders.Add(HeaderInfo.Key, HeaderInfo.Value);

}

}

Dictionary<string, object> parames = new Dictionary<string, object>();

if (!string.IsNullOrWhiteSpace(httpJob.Data))

{

parames = JsonConvert.DeserializeObject<Dictionary<string, object>>(httpJob.Data);

}

client



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。