.net core 使用 Hangfire 实现定时、延时任务

需要引用的包

1.Hangfire.AspNetCore(1.7.25)

2.Hangfire.Redis.StackExchange(1.8.5) 安装这个包是为了给hangfire做持久化使用也有其他选择比如:sqlserver等...

3.Hangfire.Dashboard.BasicAuthorization(1.0.2)面板权限认证无需验证不引用

下面我们先贴配置代码:Startup.cs

using Hangfire;
using Hangfire.Redis;

public Startup(IConfiguration configuration)
{
    _configuration = configuration;
}

public IConfiguration _configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    /*该段代码仅包含Hangifre相关配置*/
    services.AddHangfire(
        configuration => configuration
        .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
        .UseSimpleAssemblyNameTypeSerializer()
        .UseRecommendedSerializerSettings()
        .UseRedisStorage("127.0.0.1:6379")
    );
    services.AddHangfireServer();
}

如果需要使用Hangfire控制面板还需要以下配置

using Hangfire.Dashboard.BasicAuthorization;

public void Configure(IApplicationBuilder app)
{
    /*该段代码仅包含Hangifre相关配置*/
    app.UseHangfireDashboard("/hangfire", new DashboardOptions()// /hangfire 参数是访问面板的路由名称 例如:http:xxx.xxx.com/hangfire
	{
	    Authorization = new[]
		{
		    new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
			{
			    SslRedirect = false,//是否将所有非SSL请求重定向到SSL URL
				RequireSsl = false,//需要SSL连接才能访问HangFire Dahsboard。强烈建议在使用基本身份验证时使用SSL
				LoginCaseSensitive = true,//登录检查是否区分大小写
				Users = new[]
				{
				    new BasicAuthAuthorizationUser
					{
					    Login ="xxxx",//用户名
						PasswordClear = "xxxx"//密码
					}
				}
			})
		}
	});

    //上面是需要使用身份验证的配置方式,如果不需要使用身份验证的方式则按照以下配置即可
    app.UseHangfireDashboard("/hangfire");
}

使用面板可以很方便的管理循环定时执行的任务,以及查看任务的执行情况和错误日志

 

 配置完成之后我们来说一下hangfire的基础调用方式

1.基于队列的任务处理(Fire-and-forget jobs)

我们使用 BackgroundJob 类的静态方法 Enqueue 来进行调用

var JobId = BackgroundJob.Enqueue(
    () => Console.WriteLine("Enqueue")
);

这种调用方式可以说是在Hangfire中比较常见的,如果在没有异常的情况下只会执行一次,如果发生异常 Hangfire 会提供重试机制,在控制面板中可以查看 Hangfire 重试执行记录以及错误信息等。

2.延迟任务执行(Delayed jobs)

var JobId = BackgroundJob.Schedule(
    () => Console.WriteLine("Schedule"),TimeSpan.FromSeconds(10)
);

延迟执行调用可以通过参数二来指定多久后执行,例如以上是 10 秒后调用控制台输出,若出现异常与上面机制相同

3.定时任务执行(Recurring jobs)

定时循环任务执行

//参数说明 参数一:执行的方法 参数二:Cron表达式 参数三:设置时区
RecurringJob.AddOrUpdate(
    () => ClearServices.ClearSystemLog(), Cron.Daily(0, 0), TimeZoneInfo.Local
)

上面的例子是每天0点执行一次 

可以使用 Hangfire Cron类下提供的基础Cron表达式 例如每月、天、小时

如果想要更灵活的定义需要自己生成Cron表达式

Cron表达式参考:【转】cron表达式详解 - 我只吃大碗 - 博客园 (cnblogs.com)

Cron表达式在线生成器:在线Cron表达式生成器 (qqe2.com)

猜你喜欢

转载自blog.csdn.net/echozly/article/details/122445755