后台工作者HangFire与ABP框架Abp.Hangfire及扩展

HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便。

HangFire是什么

Hangfire是一个开源框架(.NET任务调度框架),可以帮助您创建,处理和管理您的后台作业,处理你不希望放入请求处理管道的操作:

通知/通讯;

xml,csv,json批量导入;

创建档案;

发射web hooks;

删除用户;

建立不同的图表;

图像/视频处理;

清除临时文件;

反复出现的自动报告;

数据库维护

Hangfire支持所有类型的后台任务 - 短时间运行和长时间运行, CPU intensive 和I/O intensive,一次性的和经常性的。你不需要重新发明轮子 ,可以直接使用。
Hangfire包含三大核心组件:客户端、持久化存储、服务端。看看官方的这张图:

image.png

Hangfire基础

基于队列的任务处理(Fire-and-forget)
延迟作业也只执行一次,但不会立即执行 - 只能在指定的时间间隔后执行。

var jobId = BackgroundJob.Schedule( () => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));

定时执行(Recurring)
按照指定的CRON计划, 重复执行的作业会被多次触发。

RecurringJob.AddOrUpdate( () => Console.WriteLine("Recurring!"), Cron.Daily);

延续性执行(Continuations)
延续性任务类似于.NET中的Task,可以在第一个任务执行完之后紧接着再次执行另外的任务:

BackgroundJob.ContinueWith( jobId, () => Console.WriteLine("Continuation!"));

延时执行任务(Delayed)
延迟作业也只执行一次,但不会立即执行 - 只能在指定的时间间隔后执行。

var jobId = BackgroundJob.Schedule( () => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));

批处理(Batches)
批处理是一组自动创建的后台作业。

var batchId = Batch.StartNew(x => { x.Enqueue(() => Console.WriteLine("Job 1")); x.Enqueue(() => Console.WriteLine("Job 2")); });

延时批处理(Batch Continuations)
批处理在父类完成后触发后台作业。

Batch.ContinueWith(batchId, x => { x.Enqueue(() => Console.WriteLine("Last Job")); });

后台进程(Background Process)
当你需要在应用程序的整个生命周期中连续运行后台进程时使用它们。

public class CleanTempDirectoryProcess : IBackgroundProcess { public void Execute(BackgroundProcessContext context) { Directory.CleanUp(Directory.GetTempDirectory()); context.Wait(TimeSpan.FromHours(1)); } }

后台作业是应用程序中非常重要的部分,Hangfire确保至少执行一次任务。要在应用程序重新启动之间保留后台作业信息,所有信息都将保存在您最喜欢的持久性存储中。
        Hangfire将您的任务保存到持久化库汇总,并且以可靠的方式处理它们。这意味着,你可以中断Hangfire Worder的线程,重新加载应用程序域,或者终止程序,即使这样您的任务仍会被处理。只有在你代码的最后一行执行完成,Hangfire才会标记这个任务完成。并且知道任务可能在最后一行代码执行之前失败。它包含多种 自动-重试机制,它可以自动处理在存储或代码执行过程中发生的错误。
       这对于通用托管环境(如IIS Server)非常重要。它们可以包含不的
优化,超时和错误处理代码 (可能导致进程终止)来防止不好的事情发生。如果您没有使用可靠的处理和自动机制,您的工作可能会丢失。您的最终用户可能无限期等待某些任务,如电子邮件,报告,通知等。

实操演练

光说不练假把式,下面我们新建一个web项目,然后NuGet引入这几个程序集

配置

然后在App_Start文件夹下Startup类配置下。
首先指定数据库,指定Hangfire使用内存存储后台任务信息.
Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("Default");
然后启用HangfireServer这个中间件(它会自动释放)
app.UseHangfireServer();
然后启用Hangfire的仪表盘(可以看到任务的状态,进度等信息)
app.UseHangfireDashboard();
然后配置下前台路由

app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new AbpHangfireAuthorizationFilter() } });

然后就是加入上面已经列出的几个例子。

var jobId = BackgroundJob.Schedule( () => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7)); RecurringJob.AddOrUpdate( () => Console.WriteLine("Recurring!"), Cron.Daily); BackgroundJob.ContinueWith( jobId, () => Console.WriteLine("Continuation!")); var jobId2 = BackgroundJob.Schedule( () => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7)); 效果

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssxgy.html