Abp中使用Hangfire实现定时任务
有时我们需要写一些定时任务来定期执行某些方法,比如数据统计、数据计算等。
这时候,我们就需要用到定时任务。
Hangfire 是一个开源且商业免费使用的工具函数库。可以让你非常容易地在应用中执行多种类型的后台任务,而无需自行定制开发和管理基于 Windows Service 后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台。
下面我们看看怎么用。
使用Hangfire,有两个库,1个事hangfire 库,一个是用来存储的库。默认hangfire的存储库是使用sqlserver,但很多企业使用的是mysql,所以需要另外安装基于mysql的存储库。
此处,为了便于显示,我们使用的是基于内存的存储库。
因为是使用abp框架,我们安装abp封装的hangfire框架。
从nuget引入:Volo.Abp.BackgroundJobs.HangFire
再引入基于内容的存储库:Hangfire.MemoryStorage
Hangfire.MemoryStorage不是abp封装的,所以可能会存在里面引用的Hangfire.Core 版本和Volo.Abp.BackgroundJobs.HangFire不一致的问题。只需要再引用Hangfire.Core,二者最高的版本即可。
比如我这边的版本就是下图:
引入完之后,在项目的module.cs 文件中进行配置
先把abp的hangfire模块依赖引入:
typeof(AbpBackgroundJobsHangfireModule) //Add the new module dependency
然后再 public override void ConfigureServices(ServiceConfigurationContext context)方法中进行配置
context.Services.AddHangfire(config => { // config.UseStorage(new MySqlStorage("server=127.0.0.1;database=patent;uid=root;pwd=WWW.1633.com;charset=utf8mb4;Allow User Variables=true;")); config.UseMemoryStorage(); });
在引用初始化方法中执行
public override void OnApplicationInitialization(ApplicationInitializationContext context)
app.UseHangfireDashboard("/hangfire"); //启用hangfire面板 app.UseHangfireServer();
这样就启用了hangfire服务,并可以通过/hangfire查看任务执行情况
接下来就是怎么调用执行我们的服务了
我们定义一个工作类
public class JobForDaiLiShiCase : ITransientDependency { public ITongJiDaiLiShiCaseService _tongJiDaiLiShiCaseService { get; set; } public async Task Run() { Console.WriteLine(DateTime.Now.ToString("HH:mm:ss")); // await _tongJiDaiLiShiCaseService.TongJiAsync(); } }
记得要注入依赖,这边注入一个ITransientDependency类型
我们定义了一个Run方法,输出时间
然后,我们同样在 项目的 .module.cs文件中去调用任务
app.UseHangfireDashboard("/hangfire"); //启用hangfire面板 app.UseHangfireServer(); // 创建每1分钟调用一次的定时任务 RecurringJob.AddOrUpdate<JobForDaiLiShiCase>(x => x.Run(), "0/2 * * * * ?");
就是利用RecurringJob进行工作任务调用。执行了run方法,并配置执行周期,采用cron表达式。 这边的表达式是2秒。
我们运行看下输出效果。
运行后,程序自动定期执行了。
但是,我们发现了一个问题,我们配置的是每隔2秒,为什么显示的是好几秒。
这就是执行速度差异的问题了。
当我们时间配置的很短的时候,是会出现差异的,但是执行次数不会变。一般我们也不建议配置这么短的时间。
至少都要几分钟以上的。还要根据任务执行的时间和资源情况来合理的制定这个执行周期。
这样,hangfire就介绍完成了。
如果我们换成mysql存储呢,我引用的是Hangfire.MySqlStorage 这个组件
只要将存储配置改下即可。
context.Services.AddHangfire(config => { // config.UseStorage(new MySqlStorage("server=127.0.0.1;database=patent;uid=root;pwd=WWW.1633.com;charset=utf8mb4;Allow User Variables=true;")); // config.UseMemoryStorage(); config.UseStorage(new MySqlStorage("server=127.0.0.1;database=patent;uid=root;pwd=23234;charset=utf8mb4;Allow User Variables=true;", new MySqlStorageOptions() { })); });
我们可以访问/hangfire 查看任务执行情况
更多分享,请大家关注我的个人公众号: