1、hangfire如何实现
Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)。并且支持持久性存储。
Hangfire 的定时任务并不是使用 Timer 类来实现的。Hangfire 是一个用于在 .NET 应用程序中执行后台作业和定时任务的库,其核心原理是基于持久化存储(如 SQL Server、Redis 等)和轮询(Polling)实现的。
具体来说,Hangfire 会将需要执行的后台作业和定时任务存储到持久化存储中,然后使用轮询来检查这些任务是否需要执行。这种方式与传统的定时器实现方式有所不同,因为它能够确保在应用程序重启或崩溃后,Hangfire 仍然能够继续执行尚未完成的任务。
当然,Hangfire 库中也有与定时器相关的 API,比如 Cron 表达式等,可以用于配置定时任务的执行时间。但是,这些 API 只是为了方便用户配置定时任务的执行时间,实际上它们并不是 Hangfire 库的核心实现。
2、cron表达式格式的格式
一个cron表达式有6个有空格分隔的时间元素,按顺序依次为:
{秒数} {分钟} {小时} {日期} {月份} {星期}
1.秒(0~59)
2.分钟(0~59)
3.小时(0~23)
4.天(月)(0~31,但是你需要考虑你月的天数)
5.月(0~11)
6.天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
3、首先需要在startup.cs文件里注册
public void ConfigureServices(IServiceCollection services)
{
// hangfire start
services.AddHangfire(
configuration => configuration
.UseSqlServerStorage("Data Source=xxx.xx.xxx.xx;Initial Catalog=database;User ID=xxx;Password=xxxxxxx;Connect Timeout=30;Encrypt=true;TrustServerCertificate=true;ApplicationIntent=ReadWrite;MultiSubnetFailover=False")
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
);
services.AddHangfireServer();
// end
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//开发环境
app.UseHangfireDashboard("/hangfire");
}
else
{
//要发布的话需要在这个里面也加上
app.UseHangfireDashboard("/hangfire", new DashboardOptions()
}
}
之后可以在services里面调用方法来执行定时任务
// 每天早上8点,除去周六和周日
RecurringJob.AddOrUpdate(
() => 方法名(), "0 8 * *1, 2, 3, 4, 5", TimeZoneInfo.Local);
// 每天8点
RecurringJob.AddOrUpdate(
() => 方法名(""), Cron.Daily(8, 0), TimeZoneInfo.Local);
除了Daily的方法外,还有Hourly,monthly等,也可以自己使用Cron表达式。
可以在网站启动后加上/hangfire可以看到
什么时候执行,上次执行的时间