https://www.cnblogs.com/gnsilence/p/10665951.html
最近由于之前的任务调度框架总出现问题,因此想寻找一个替代品,之前使用的是Quartz.Net,这个框架方便之处就是支持cron表达式适合复杂日期场景使用,以及秒级任务。但是配置比较复杂,而且管理不方便,自己开发了个web管理页面,不过这个需要额外的单独线程去统一管理工作状态,很容易出现问题。
有考虑过 “FluentScheduler” ,使用简单,但是管理配置也很麻烦,我希望能做到配置简单,管理方便,高性能。最后想到了以前听过的hangfire,它的好处就是自带控制面板,在园子里看了很多相关资料,偶然发现了有人拓展过hangfire通过调用api接口来执行任务,这种方式可以避免依赖本地代码,方便部署,在此基础上,我用空闲时间拓展了一下现在已经基本可以满足需求。
所拓展的功能全部属于外部拓展,因此hangfire版本可以一直更新,现在已经更新最新版,支持秒级任务
由于更新到最新版hangfire 1.7支持秒级任务,使用的在线表达式生成部分表达式有问题,注掉了秒级任务表达式生成,有时间需要详细测试更改,可以参考(hangfire官方提供的表达式)
现在已经实现的功能有:
1,部署及调试:只需要配置数据库连接,然后编译即可运行,无需建表,支持(redis,mysql, sqlserver)其他数据库暂时用不到没测试。推荐使用redis集群。项目中直接添加了redis的存储包,已经更新StackExchange.Redis到最新版本方便拓展,调试时可以直接调试。部署,只需要发布项目,运行创建windows服务的bat命令,命令已经包含在项目中,或者发布至Linux。
2,周期任务:支持在控制面板页面上添加周期任务,编辑周期任务,删除周期任务,手动触发周期任务,暂停和继续周期任务(暂停实现的原理是通过set中添加属性,在job执行前,过滤掉,直接跳过执行,因为hangfire中job一旦创建就失去了控制权,只能通过过滤器去拦截),任务暂停后会查询状态并渲染面板列表为红色字体方便查找哪个任务被暂停。
3,计划任务:在作业选项卡中,计划作业中可以实现添加计划任务,计划任务可以使任务在指定的分钟后执行,只执行一次。
4,只读面板:通过配置的用户名密码,使用户只具有读取面板的权限,这样可以防止误操作
1 //只读面板,只能读取不能操作
2 app.UseHangfireDashboard("/job-read", new DashboardOptions
3 {
4 AppPath = "#",//返回时跳转的地址
5 DisplayStorageConnectionString = false,//是否显示数据库连接信息
6 IsReadOnlyFunc = Context =>
7 {
8 return true;
9 },
10 Authorization = new[] { new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
11 {
12 RequireSsl = false,//是否启用ssl验证,即https
13 SslRedirect = false,
14 LoginCaseSensitive = true,
15 Users = new []
16 {
17 new BasicAuthAuthorizationUser
18 {
19 Login = "read",
20 PasswordClear = "only"
21 },
22 new BasicAuthAuthorizationUser
23 {
24 Login = "test",
25 PasswordClear = "123456"
26 },
27 new BasicAuthAuthorizationUser
28 {
29 Login = "guest",
30 PasswordClear = "123@123"
31 }
32 }
33 })
34 }
35 });