外观
Hangfire
文档地址:https://docs.hangfire.io/en/latest/getting-started/index.html
HangFire类似Quartz.NET的任务组件,核心组件服务端、客户端、持久化存储,可与大多数.NET平台一起使用,客户端负责创建后台作业并将其保存到存储中。后台作业是应该在当前执行上下文之外执行的工作单元,例如在后台线程,其他进程中,甚至在不同的服务器上执行-借助Hangfire,即使没有其他配置,也可以实现所有工作。
- 支持最小的周期单位为分钟
- 持久化保存任务,还可在仪表盘中手动执行任务
- 重试机制(注意:由于是持久化存储的,所有当你程序停止后没有删除任务,程序重新启动后 仍会尝试继续前面的任务)
- 分布式部署
- 可扩展性
组件:
- HangFire 是程序包名称和主程序包,其中包括所有需要的依赖项.在这种情况下,此主程序包针对.NET框架.
- HangFire.Core 是包含核心组件的程序包,该程序包的所有变体都可能依赖于这些组件.
- HangFire.AspNetCore 是支持.NET Core的扩展 (Hangfire是持久化任务,所以还需要一个持久化扩展存储,sqlserver、mysql、redis等,会自动在库中创建表) ----- 安装报错可以手动创建数据库试试----!
.NET Core中使用: IIS8.0以下配置预加载比较麻烦 会由于回收机制导致任务停止运行 建议别用asp.net的形式 尽可能的使用服务
//Startup.cs
//引入HangFire.AspNetCore、HangFire.PostgreSql
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddHangfire(o => o.UsePostgreSqlStorage("DATABASE=Hangfire;HOST=localhost;PASSWORD=123456;USER ID=postgres;PORT=5432;Pooling=true"));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHangfireServer();
app.UseHangfireDashboard(); // 访问"/hangfire" 使用仪表盘 可视化执行任务
//即时执行,创建时执行仅一次
BackgroundJob.Enqueue<SayHello>(job => job.Hello());
//延迟执行,根据参数
BackgroundJob.Schedule<SayHello>(jobs => jobs.DelayHello(), DateTimeOffset.UtcNow.AddMinutes(1));
//周期性执行任务
RecurringJob.AddOrUpdate<SayHello>("周期任务1",jobs=> jobs.loopHello(), Cron.Minutely());
/*
* 周期性任务也可以使用CRON表达式来配置
* Cron表达式:是由七子表达式组成,描述个别细节的时间表:秒 分钟 小时 日 月 星期 年(年可省略)
* RecurringJob.AddOrUpdate(() => Console.Write("Hello!"), "0 */1 * * * ?"); //每分钟执行一次
*
*/
}public class SayHello
{
public void Hello()
{
Console.WriteLine("");
Console.WriteLine($"{DateTime.Now},Hello");
}
public void DelayHello()
{
Console.WriteLine($"{DateTime.Now},Hello !!!");
}
public async Task loopHello()
{
Console.WriteLine($"{DateTime.Now},Hello World!!!");
}
}结果:
仪表盘:
