如果从BackgroundWorkerBase派生或直接实现IBackgroundWorker,则将覆盖/实现Start,Stop和WaitToStop方法。Start和Stop方法应该是非阻塞的,WaitToStop方法应该等待 worker完成当前的关键任务。
注册后台工作者创建后台工作者后,我们应该将其添加到 IBackgroundWorkerManager。最常见的地方是你的模块的PostInitialize方法:
public class MyProjectWebModule : AbpModule { //... public override void PostInitialize() { var workManager = IocManager.Resolve<IBackgroundWorkerManager>(); workManager.Add(IocManager.Resolve<MakeInactiveUsersPassiveWorker>()); } }虽然我们通常在PostInitialize中加入工作人员,但对此没有限制。您可以在任何地方注入IBackgroundWorkerManager,并在运行时添加工作人员。当您的应用程序正在关闭时,IBackgroundWorkerManager将停止并释放所有注册的工作人员。
后台工作者生命周期后台工作人员通常以单例的。但是没有限制。如果您需要同一工人类的多个实例,则可以将其设置为暂时的,并向IBackgroundWorkerManager添加多个实例。在这种情况下,您的工作人员可能是参数化的(例如,您有一个LogCleaner类,但是他们监视的两个LogCleaner工作者实例并清除不同的日志文件夹)。
高级调度ASP.NET Boilerplate的后台工作系统很简单。除了定期运行的工人之外,它没有一个时间表系统。如果您需要更高级的计划功能,我们建议您检查Quartz或其他库。
让您的应用程序一直运行后台作业和工作人员只有在您的应用程序正在运行时才有效 如果很长一段时间没有对Web应用程序执行任何请求,ASP.NET应用程序将默认关闭。因此,如果您在Web应用程序中托管后台作业(这是默认行为),则应确保您的Web应用程序配置为始终运行。否则,后台作业只在您的应用程序正在使用时才起作用。
有一些技术来完成这一点。最简单的方法是定期从外部应用程序请求您的Web应用程序。因此,您也可以检查您的Web应用程序是否已启动并正在运行。 Hangfire文档解释了其他一些方法。
通过以上官方文档,我们在程序里配置一下。
运行一下效果是一样的。
#14d6ddee0b535ed2a0027765b3aecbac#
其他
其实Hangfire还是蛮简单的。如果你需要了解更多关于Abp.Hangfire的内容,建议你去看一下github上一个专门关于Abp.Hangfire的demo,
地址:https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/BackgroundJobAndNotificationsDemo
另外 ABP后台工作者类使用HANGFIRE这篇文章
讲解abp Hangfire 缺点是工作者类依赖了具体的基类(PeriodicBackgroundWorkerBase),就会存在应用程序耦合。以及解决耦合的办法,算是对abp Hangfire的扩展,我不太认同,各有看法吧。
Hangfire是一个后台可监控的应用,不用每次都要从服务器拉取日志查看,在没有ELK的时候相当不方便。Hangfire控制面板不仅提供监控,也可以手动的触发执行定时任务。如果在定时任务处理方面没有很高的要求,比如一定要5s定时执行,Hangfire值得拥有。抛开这些,Hangfire优势太明显了:
持久化保存任务、队列、统计信息
重试机制
多语言支持
支持任务取消
支持按指定Job Queue处理任务
服务器端工作线程可控,即job执行并发数控制
分布式部署,支持高可用
良好的扩展性,如支持IOC、Hangfire Dashboard授权控制、Asp.net Core、持久化存储等
Hangfire扩展 Hangfire扩展性大家可以参考这里,有几个扩展是很实用的.下面这些关于Hangfire扩展大家可以自己查资料。后面如果有机会的话,我再补上。Hangfire Dashborad日志查看
Hangfire Dashborad授权
IOC容器之Autofac
RecurringJob扩展
与MSMQ集成
持久化存储之Redis