快速入门
优质
小牛编辑
151浏览
2023-12-01
先介绍下 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 = "1877682825@qq.com",
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<string> {"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
浏览器打开 localhost:5000/job-read 就会打开 hangfire 的只读 dashbord 以上按钮将隐藏
以上代码在本仓库的Test里面有,你配置好 db 后可以直接跑起来的