ASP.NET Core Web API Hangfire
- 前言
- 一、安装
- 二、相关代码
- 1.代码片段
- 2.代码片段
- 3.运行效果
- 三、测试代码
- 1.即发即弃作业
- 2.延迟作业
- 3.重复作业
- 4.延续作业
- 5.页面调度作业
前言
👨💻👨🌾📝记录学习成果,以便温故而知新Hangfire是一种定任务调度器
本文使用MySQL服务器
本文也参考了其他人文章的一些思路。
一、安装
NuGet安装
Hangfire.AspNetCore
Hangfire.MySqlStorage
由于选择的MySQL数据库,所以安装Hangfire.MySqlStorage。
二、相关代码
Program.cs中添加代码:
1.代码片段
builder.Services.AddHangfire(config =>
{config.SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings();config.UseStorage(new MySqlStorage(@"server=127.0.0.1;user=root;password=root;database=hangfiredb;allowuservariables=True;",//必须允许用户自定义参数,不然面板不能使用new MySqlStorageOptions { TablesPrefix = "Hangfire" })).UseHangfireHttpJob();
});builder.Services.AddHangfireServer();
builder.Services.AddTransient<IBackgroundJobClient, BackgroundJobClient>();
MySQL数据连接:
@“server=127.0.0.1;user=root;password=root;database=hangfiredb;allowuservariables=True;”
如下:
.UseHangfireHttpJob()
实现的效果是可以在控制台添加任务调度。
前提是需要安装:
Hangfire.HttpJob
如下代码:
new MySqlStorageOptions { TablesPrefix = “Hangfire” }
是制定数据库中生成的表是以Hangfire开头,如下图:
在测试的时候没有处理好一个小细节,如果代码写成:
new MySqlStorageOptions { TablesPrefix = "Hangfire_" }
将会更好!!!
2.代码片段
app.UseHangfireDashboard();
3.运行效果
http://localhost:5279/hangfire/
三、测试代码
在项目新增控制器HangfireController及一个方法:
[HttpGet("Execute")]
public void Execute(string job)
{Debug.WriteLine(job);
}
在控制台=>作业=>完成 中查看执行效果。
1.即发即弃作业
[HttpGet("test1")]
public string Test1()
{string job = "即发即弃作业";BackgroundJob.Enqueue(() => Execute(job));return job;
}
测试效果:
2.延迟作业
[HttpGet("test2")]
public string Test2()
{string job = "延迟作业";BackgroundJob.Schedule(() => Execute(job), TimeSpan.FromMinutes(1));return job;
}
测试效果:
3.重复作业
[HttpGet("test3")]
public string Test3()
{string job = "重复作业";RecurringJob.AddOrUpdate(job, () => Execute(job), "0 * * * * ?", new RecurringJobOptions(){MisfireHandling = MisfireHandlingMode.Ignorable,TimeZone = TimeZoneInfo.Local,});return job;
}
4.延续作业
[HttpGet("test4")]
public string Test4()
{var jobId = BackgroundJob.Enqueue(() => Execute("延续作业1"));BackgroundJob.ContinueJobWith(jobId, () => Execute("延续作业2"));return "延续作业";
}
测试效果:
5.页面调度作业
[HttpGet("test5")]
public string Test5()
{Debug.WriteLine("页面调度作业:" + DateTime.Now.ToString());return "页面调度作业:" + DateTime.Now.ToString();
}
测试效果:
页面调度作业感觉像xxl-job,但是操作的便捷性上个人感觉略差一点意思。