.Net Core定时调度hangfire:存储配置

hangfire会将定时任务等信息存储起来,有内存存储、缓存存储和数据库存储三种方式。

首先在nuget中安装适配.net core版本的库Hangfire.AspNetCore。

一、内存存储

在nuget中找到Hangfire.MemoryStorage进行安装。

之后在Startup文件中添加如下即可:

public void ConfigureServices(IServiceCollection services)
{
  services.AddHangfire(t => t.UseMemoryStorage());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseHangfireServer();
}

 二、数据库存储

数据库有很多种MySql、Oralce、SqlServer,不过SqlServer是hangfire的默认选择,所以以此为例在nuget安装对应的包Hangfire.SqlServer。

其他的数据库只要找对应的安装包就行。

支持的数据库为Microsoft SQL Server 2008R2(任何版本,包括 LocalDB)和更高版本。

但是,仅适用于 Hangfire < 1.5.9:数据库不使用快照隔离级别,并且READ_COMMITED_SNAPSHOT选项(另一个名称是Is Read Committed Snapshot On是 disabled否则,某些后台作业可能不会被处理。

具体在Startup文件中添加如下即可使用:

public void ConfigureServices(IServiceCollection services)
{
  services.AddHangfire(configuration => configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)      // 设置数据兼容级别
    .UseSimpleAssemblyNameTypeSerializer()                          // 使用简单程序集名称类型序列化程序
    .UseRecommendedSerializerSettings()                             // 使用推荐的序列化设置
    .UseSqlServerStorage(Configuration.GetValue<string>("ConnectionStrings:BaseDb:ConnectionString"), new SqlServerStorageOptions   //数据库设置
    {
      TransactionIsolationLevel = IsolationLevel.ReadCommitted,   // 事务隔离级别。默认值为读提交。
      TransactionTimeout = TimeSpan.FromMinutes(1),               // 事务超时。默认为1分钟
      JobExpirationCheckInterval = TimeSpan.FromHours(1),         // 作业过期检查间隔(管理过期记录)。默认为1小时
      CountersAggregateInterval = TimeSpan.FromMinutes(5),        // 间隔到聚合计数器。默认为5分钟
      PrepareSchemaIfNecessary = true,                            // 如果设置为true,则创建数据库表。默认值为true
      CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),           // 命令批处理最大超时时间
      SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),       // 滑动超时时间
      QueuePollInterval = TimeSpan.Zero,                          // 作业队列轮询间隔。默认值为15秒
      UseRecommendedIsolationLevel = true,                        // 是否使用建议的隔离级别
      DisableGlobalLocks = true,                                  // 是否禁用全局锁,需要迁移到模式7
      DashboardJobListLimit = 50000,                              // 仪表板作业列表上限。默认值为50000 
    }));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseHangfireServer();
}

启动之后因为我们设置了PrepareSchemaIfNecessary为true,所以会自动在数据库中创建数据表存储信息。

 

 给hangfire的数据库链接可以给予最小的权限,既只操作hangfire相关表的权限,以提高安全。

三、Redis存储

使用Redis 作业存储相比使用 SQL Server 存储能更快的处理作业。

但是,官方的版本是收费的,有免费版HangFire.Redis.StackExchange。

使用如下:

public void ConfigureServices(IServiceCollection services)
{
  services.AddHangfire(x =>
  {
    RedisStorageOptions options = new RedisStorageOptions()
    {
      Prefix = "hangfire:",   //键前缀
    };
    x.UseRedisStorage(Configuration.GetValue<string>("ConnectionStrings:Redis:ConnectionString"), options);
  });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseHangfireServer();
}

查看redis可以发现,hangfire的信息已经加入到缓存中了

 

posted @ 2021-07-06 21:46  以往清泉  阅读(1277)  评论(0编辑  收藏  举报
//替换成自己路径的js文件