由于公司项目的业务需要,在对接一个外部接口的时候需要每隔五分钟触发一次对应的查询接口。如果按照以前的习惯,我估计就直接操作个时钟了。只是出于好奇的大概搜了一下这方面的东西,就发现了这个叫做hangfire的工具库。在github上查询了一下发现一个开源的项目叫hangfire.httpjob,看描述比hangfire更强大一些,就选择试着用这个工具来完成这次的需求。
只是也不知道是什么原因的,在注册startup的时候,参考着官方文档却发生了各种各样莫名的问题。后来发现在使用hangfire.httpjob的时候会需要用到很多的基础库,如果没有引入会需要单独再安装一下,并且官方的文档里并不是所有的功能都需要去实现出来的,可以按照自己实际的需要来配置就好了。
这里推荐初次使用的,在安装了hangfire.httpjob包以后,再安装一下:
Hangfire(hangfire.httpjob是基于这个包来开发的)
Hangfire.AspNetCore(据说这个是Hangefire的核心组件库)
Hangfire.Console(据说是Hangfire的Dashbord的一个插件,记录job运行日志的)
Hangfire.MemoryStorage(这个是可以用来代替本地存储的一套内存方案)
Hangfire.Tags(据说是Hangfire的Dashbord的一个插件,把运行的job按照名称进行分组在dashbord里面方便查看)
安装完以后打开Startup开始注册:
public void ConfigureServices(IServiceCollection services)
{
//......其他中间件注册
services.AddHangfire(ConfigHangFire);//ConfigHangFire定义在下面
}
private void ConfigHangFire(IGlobalConfiguration globalConfiguration)
{
var memoryStorage = new MemoryStorage();//实例化虚拟内存
globalConfiguration.UseStorage(memoryStorage);//将数据持久化到内存
globalConfiguration.UseConsole();//使用控制台插件
//下面的部分定义HttpJob的设置
globalConfiguration.UseHangfireHttpJob(new HangfireHttpJobOptions {
//下面的部分定义报错文件的下发地址
MailOption = new MailOption {
Server = "smtp.qq.com",//这边使用QQ邮箱
Port = 465,
UseSsl = true,
User = "@qq.com",//这边填写QQ邮箱地址
Password = "test",
},
DefaultRecurringQueueName = "recurring" //这个是在下面设置的queue列表中的其中一个
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//.......其他中间件启用
#region HangFire
app.UseHangfireServer();//启用hangfire的服务
//启用Dashboard并定位地址到/hangfire
app.UseHangfireDashboard("/hangfire", new DashboardOptions
//定义Dashboard设置
{
AppPath = "#",
DisplayStorageConnectionString = false,
IsReadOnlyFunc = Context => false,
}
);
#endregion
}
注册完成以后可以直接启动项目,等项目打开以后,再项目后缀输入/hangfire进入Dashboard后台
这里就可以直接通过Dashboard来创建job执行。以我现在需要进行的间隔五分钟的循环为例:
点击周期性作业进去以后,选择新增周期性作业
到这个环节就直接按照自己的实际项目进行填写就行了,唯一需要注意的是Cron参数,这里需要按照Cron语法来填写,具体语法可以自行搜索一下,大概可以用以下的这些完成大部分操作:
- */5 * * * * ? :每隔5秒执行一次
- 0 */1 * * * ? :每隔1分钟执行一次
- 0 0 23 * * ? :每天23点执行一次
- 0 0 1 * * ? :每天凌晨1点执行一次:
- 0 0 1 1 * ? :每月1号凌晨1点执行一次
- 0 0 23 L * ? : 每月最后一天23点执行一次
- 0 0 1 ? * L :每周星期天凌晨1点实行一次
- 0 26,29,33 * * * ? : 在26分、29分、33分执行一次
- 0 0 0,13,18,21 * * ? : 每天的0点、13点、18点、21点都执行一次