hangfire支持mysql_快速入门 - Hangfire.HttpJob 中文文档

先介绍下 Hangfire.HttpJob 自身引用的组件

Hangfire.AspNetCore (因为Hangfire.HttpJob是作为Hangfire的插件,Hangfire.AspNetCore是Hangfire的核心组件)

Hangfire.Console (Hangfire.Console是Hangfire的Dashbord的一个插件,记录job运行日志的)

Hangfire.Tags (这个是Hangfire的Dashbord的一个插件,把运行的job按照名称进行分组在dashbord里面方便查看)

HttpClientFactory (由于Hangfire.HttpJob是用web HttpClient的方式进行job调用的,所以使用我开源的HttpCientFactory组件可以规避HttpCliet使用上的一些坑点)

MailKit (Hangfire.HttpJob支持job运行失败或者成功发送邮件通知)

Newtonsoft.Json (这个不用介绍了)

这里测试用Mysql作为hangfire的存储。如果用SqlServer可以参考wiki的介绍

nuget 引用如下包:

Hangfire.HttpJob

Hangfire.Tags.Mysql (这个是我开源的一个针对Hangfire.Tags的mysql存储)

Hangfire.MySql.Core (这个是Hangfire本身的mysql存储)

Hangfire.Dashboard.BasicAuthorization (这个是Hangfire的auth认证组件)

我这里用Nlog记录日志

NLog.Extensions.Logging

public class Startup{

public void ConfigureServices(IServiceCollection services)

{

services.AddHangfire(Configuration);//Configuration是下面的方法

}

private void Configuration(IGlobalConfiguration globalConfiguration)

{

var mysqlOption = new MySqlStorageOptions

{

TransactionIsolationLevel = IsolationLevel.ReadCommitted,

QueuePollInterval = TimeSpan.FromSeconds(15),

JobExpirationCheckInterval = TimeSpan.FromHours(1),

CountersAggregateInterval = TimeSpan.FromMinutes(5),

PrepareSchemaIfNecessary = true,

DashboardJobListLimit = 50000,

TransactionTimeout = TimeSpan.FromMinutes(1),

TablePrefix = "hangfire"

}

globalConfiguration.UseStorage(new MySqlStorage("HangfireMysqlConnectionString",mysqlOption))

.UseConsole(new ConsoleOptions()

{

BackgroundColor = "#000079"

})

.UseHangfireHttpJob(new HangfireHttpJobOptions

{

//你如果不使用这个使用钉钉也是可以的 看wiki里面关于使用钉钉通知的介绍

MailOption = new MailOption

{

Server = "smtp.qq.com",

Port = 465,

UseSsl = true,

User = "[email protected]",

Password = "test",

},

DefaultRecurringQueueName = "recurring" //这个是在下面设置的queue列表中的其中一个

})

.UseTagsWithMysql(sqlOptions: mysqlOption);

}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory logging)

{

#region NLOG 你不用NLOG也可以去掉

NLog.LogManager.LoadConfiguration("NLog.Config");

logging.AddNLog();

#endregion

//强制显示中文

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");

//强制显示英文

//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("");

var queues = new List {"default","apis","recurring"};

app.UseHangfireServer(new BackgroundJobServerOptions

{

ServerTimeout = TimeSpan.FromMinutes(4),

SchedulePollingInterval = TimeSpan.FromSeconds(15),//秒级任务需要配置短点,一般任务可以配置默认时间,默认15秒

ShutdownTimeout = TimeSpan.FromMinutes(30),//超时时间

Queues = queues,//队列

WorkerCount = Math.Max(Environment.ProcessorCount, 40)//工作线程数,当前允许的最大线程,默认20

});

var hangfireStartUpPath = "/job";

app.UseHangfireDashboard(hangfireStartUpPath, new DashboardOptions

{

AppPath = "#",

DisplayStorageConnectionString = false,

IsReadOnlyFunc = Context => false,

Authorization = new[] { new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions

{

RequireSsl = false,

SslRedirect = false,

LoginCaseSensitive = true,

Users = new []

{

new BasicAuthAuthorizationUser

{

Login = "admin",

PasswordClear = "test"

}

}

}) }

});

var hangfireReadOnlyPath = "/job-read";

//只读面板,只能读取不能操作

app.UseHangfireDashboard(hangfireReadOnlyPath, new DashboardOptions

{

IgnoreAntiforgeryToken = true,//这里一定要写true 不然用client库写代码添加webjob会出错

AppPath = hangfireStartUpPath,//返回时跳转的地址

DisplayStorageConnectionString = false,//是否显示数据库连接信息

IsReadOnlyFunc = Context => true

});

app.Run(async (context) =>

{

await context.Response.WriteAsync("ok.");

});

}

}

注意: 如果没有在数据库里面创建一个db叫hangfire的话 会报错! 可以不创建hangfire的表 因为按照如上配置 启动程序会判断有没有叫hangfire的db。如果存在没有表会初始化hangfire的表!

按照以上配置 启动程序

浏览器打开 localhost:5000/job 就会打开hangfire的 dashbord

hangfire支持mysql_快速入门 - Hangfire.HttpJob 中文文档_第1张图片

浏览器打开 localhost:5000/job-read 就会打开 hangfire 的只读 dashbord 以上按钮将隐藏

以上代码在本仓库的Test里面有,你配置好 db 后可以直接跑起来的

你可能感兴趣的:(hangfire支持mysql)