任务调度是我们项目中常见的功能,虽然任务调度的功能实现本身并不难,但一个好用的轮子还是可以给我们的开发的效率提升不少的。
在.net环境中,较为有名的任务调度框架是hangfire与quartz.net,本文这里主要介绍hangfire,相比quartz.net来说,它提供了更加友好的页面,使用起来更加方便。hangfire的优点网上有不少文章介绍的,这里简单的列举一下:
- 支持各种常见的任务类型
- 持久化保存任务、队列、统计信息
- 重试机制
- 多语言支持
- 支持任务取消
- 支持按指定job queue处理任务
- 服务器端工作线程可控,即job执行并发数控制
- 分布式部署,支持高可用
- 良好的扩展性,如支持ioc、hangfire dashboard授权控制、asp.net core、持久化存储等
简单使用:
这里就简单的演示.net core下基本的用法。首先建立一个.net core 的web项目,如果没有别的需求使用空项目模板也可以。
1. 添加程序包:
install-package hangfire
2.配置数据库:
hangfire默认支持sqlserver和redis,也可以通过第三方扩展支持sqlite等数据库。这里我选择的是常用的sqlserver。
使用sqlserver作为存储引擎时,首先需要在sqlserver上创建一个数据库,可以不用建表,hangfire会自动建表。
3. 注册服务:
首先在startup.cs的configureservices 方法中注册服务:
services.addhangfire(r => r.usesqlserverstorage("data source=192.168.18.130;initial catalog=hangfiredemo;user id=sa;password=abc123@ss"));
然后在configure 方法中加入hangfireserver及hangfiredashboard:
app.usehangfireserver(); app.usehangfiredashboard();
此时启动程序,就可以通过http://localhost:5000/hangfire查看程序主界面了,默认还自带中文
4. 配置任务
hangfire提供了一系列接口配置任务:
//基于队列的任务处理(fire-and-forget jobs) var jobid = backgroundjob.enqueue( () => console.writeline("fire-and-forget!")); //延迟任务执行(delayed jobs) var jobid = backgroundjob.schedule( () => console.writeline("delayed!"), timespan.fromdays(7)); //定时任务执行(recurring jobs) recurringjob.addorupdate( () => console.writeline("recurring!"), cron.daily); //延续性任务执行(continuations) recurringjob.addorupdate( () => console.writeline("recurring!"), cron.daily);
这些任务是配置在服务器上的,如果要动态配置任务则可以通过让服务器提供接口即可。
缺点
最后也简单的说下hangfire的缺点吧,另一个比较热门的任务调度框架是quartz.net,它和hangfire相比有如下优点:
- 支持秒级单位的定时任务处理,但是hangfire只能支持分钟及以上的定时任务处理
- 更加复杂的触发器,日历以及任务调度处理
- 可配置的定时任务
其中hangfire最大的缺点可能是第一条,任务执行时间精度不够,不过在大部分应用场景来说,这个不是很大的问题。
到此这篇关于.net任务调度框架hangfire的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。