Hangfire.Redis.StackExchange
这是一个基于HangFire.Redis的Hangfire Redis存储,但使用了优秀的StackExchange.Redis客户端。
亮点
- 支持Hangfire批处理(Hangfire Pro的功能)
- 通过ConnectionMultiplexer高效利用Redis资源
- 支持Redis前缀,允许在单个Redis数据库上使用多个Hangfire实例
- 允许自定义成功和失败列表的大小
尽管名为
Hangfire.Redis.StackExchange.StrongName
,但它未签名,因为Hangfire.Core
尚未签名。
教程:在ASP.NET Core MVC上使用Redis的Hangfire
入门
要在ASP.NET Core MVC项目中使用Redis的Hangfire,首先需要安装至少这两个包:Hangfire.AspNetCore
和Hangfire.Redis.StackExchange
。
在Startup.cs
中,以下是启用Redis上的Hangfire所需的最基本代码:
public class Startup
{
public static ConnectionMultiplexer Redis;
public Startup(IHostingEnvironment env)
{
// 为简洁起见,省略了其他代码/配置。
Redis = ConnectionMultiplexer.Connect(Configuration.GetConnectionString("Redis"));
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(configuration =>
{
configuration.UseRedisStorage(Redis);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseHangfireServer();
}
}
**注意:**如果你使用的是
Microsoft.Extensions.Caching.Redis
包,你需要使用Hangfire.Redis.StackExchange.StrongName
,因为前者需要StackExchange.Redis.StrongName
而不是StackExchange.Redis
!
配置
configuration.UseRedisStorage(...)
此方法接受两个参数:
-
第一个参数接受Redis连接字符串或
ConnectionMultiplexer
对象。根据StackExchange.Redis官方文档的建议,实际上建议创建一个ConnectionMultiplexer
以供多次重用。 -
第二个参数接受
RedisStorageOptions
对象。截至1.7.0版本,你可以在该对象中设置以下属性:
namespace Hangfire.Redis
{
public class RedisStorageOptions
{
public const string DefaultPrefix = "{hangfire}:";
public RedisStorageOptions();
public TimeSpan InvisibilityTimeout { get; set; }
public TimeSpan FetchTimeout { get; set; }
public string Prefix { get; set; }
public int Db { get; set; }
public int SucceededListSize { get; set; }
public int DeletedListSize { get; set; }
}
}
强烈建议设置Prefix属性,以避免与目标相同Redis存储的其他项目重叠!
app.UseHangfireServer(...)
此方法接受BackgroundJobServerOptions
作为第一个参数:
namespace Hangfire
{
public class BackgroundJobServerOptions
{
public BackgroundJobServerOptions();
public string ServerName { get; set; }
public int WorkerCount { get; set; }
public string[] Queues { get; set; }
public TimeSpan ShutdownTimeout { get; set; }
public TimeSpan SchedulePollingInterval { get; set; }
public TimeSpan HeartbeatInterval { get; set; }
public TimeSpan ServerTimeout { get; set; }
public TimeSpan ServerCheckInterval { get; set; }
public IJobFilterProvider FilterProvider { get; set; }
public JobActivator Activator { get; set; }
}
}
在这些选项中,可以手动设置几个间隔选项(设置为更长的间隔)以减少CPU负载:
-
SchedulePollingInterval
默认设置为15秒。 -
HeartbeatInterval
默认设置为30秒。 -
ServerTimeout
和ServerCheckInterval
默认设置为5分钟。
仪表板
以下是在ASP.NET Core MVC应用程序中实现Hangfire仪表板的简短代码片段,仅限于具有Administrator
角色的cookie认证用户访问。在官方文档中阅读更多内容。
public class AdministratorHangfireDashboardAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize(DashboardContext context)
{
var user = context.GetHttpContext().User;
return user.Identity.IsAuthenticated && user.IsInRole("Administrator");
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCookieAuthentication(...);
// 此中间件必须放在身份验证中间件之后!
app.UseHangfireDashboard(options: new DashboardOptions
{
Authorization = new[] { new AdministratorHangfireDashboardAuthorizationFilter() }
});
}
通过ASP.NET Core依赖注入服务的作业
为了使应用程序代码更清晰和易于管理,可以在通过依赖注入注册的类中定义作业。
public class MyHangfireJobs
{
public async Task SendGetRequest()
{
var client = new HttpClient();
await client.GetAsync("https://www.accelist.com");
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<MyHangfireJobs>();
}
使用这种技术,注册的作业服务将能够通过构造函数参数获得其他服务作为依赖项,比如Entity Framework Core的DbContext
;这使得开发功能强大的作业变得相对容易。
然后,你可以使用泛型表达式执行这些作业:
BackgroundJob.Enqueue<MyHangfireJobs>(jobs => jobs.SendGetRequest());
BackgroundJob.Schedule<MyHangfireJobs>(jobs => jobs.SendGetRequest(), DateTimeOffset.UtcNow.AddDays(1));
RecurringJob.AddOrUpdate<MyHangfireJobs>("RecurringSendGetRequest", jobs => jobs.SendGetRequest(), Cron.Hourly());