hangfire开发教程循环任务20分钟后停止,是什么原因

执行后台任务的利器——Hangfire
来源:博客园
今年1月31日,在微软的MVP 2015社区大讲堂上,我给大家分享了一个演讲:在ASP.NET应用中执行后台任务。其中介绍了三种技术的应用:QueueBackgroundWorkItem、Hangfire和Azure WebJobs。当时由于时间关系,对三者都是简要介绍。今天想和大家着重介绍下Hangfire。 Hangfire是一个开源且商业免费使用的工具函数库。可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows Service后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台。 通过Nuget就可以在你的应用程序中安装Hangfire:Install-Package Hangfire Hangfire的具有如下特性和有点: 支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。使用方法:BackgroundJob.Enqueue(() => Console.WriteLine("Simple!")); 延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行。使用方法:BackgroundJob.Schedule(() => Console.WriteLine("Reliable!"), TimeSpan.FromDays(7)); 循环任务执行:只需要简单的一行代码就可以添加重复执行的任务,其内置了常见的时间循环模式,也可以基于CRON表达式来设定复杂的模式。使用方法:RecurringJob.AddOrUpdate(() => Console.WriteLine("Transparent!"), Cron.Daily); 持久化保存任务、队列、统计信息:默认使用SQL Server,也可以配合消息队列来降低队列处理延迟,或配置使用Redis来获得更好的性能表现 内置自动重试机制:可以设定重试次数,还可以手动在控制台重启任务 除了调用静态方法外还支持实例方法 能够捕获多语言状态:即可以把调用者的Thread.CurrentCulture和Thread.CurrentUICulture信息同任务持久保存在一起,以便任务执行的时候多语言信息是一致的 支持任务取消:使用CancellationToken这样的机制来处理任务取消逻辑 支持IoC容器:目前支持Ninject和Autofac比较常用的开源IoC容器 支持Web集群:可以在一台或多台机器上运行多个Hangfire实例以便实现冗余备份 支持多队列:同一个Hangfire实例可以支持多个队列,以便更好的控制任务的执行方式 并发级别的控制:默认是处理器数量的5倍工作行程,当然也可以自己设定 具备很好的扩展性:有很多扩展点来控制持久存储方式、IoC容器支持等 为什么要使用Hangfire这样的函数库呢?我觉得好处有如下几个方面: 开发简单:无需自己额外做开发,就可以实现任务的队列执行、延迟执行和重复执行 部署简单:可以同主ASP.NET应用部署在一起,测试和维护都相对简单 迁移简单:由于宿主不仅限于ASP.NET,那么未来可以非常容易的把任务执行器放到其他地方(需要改变的就是在其他宿主中启动Hangfire服务器) 扩展简单:由于开源且有很多扩展点,在现有插件都不满足自己需要的情况下能够容易的进行扩展 之前我把Hangfire运用到两种情况下: 后台长时间的科学计算:这样就可以让请求马上返回给客户端,后台完成长时间计算后,用SignalR实时提醒用户 后台群发邮件:通过延迟和循环任务分批通过SendCloud这样的服务发送群发邮件 当然,Hangfire的应用场景还很多,比如在后台处理电商卖家的订单。 MVP 2015社区大讲堂演讲的PPT在此: MVP 2015社区大讲堂之:在ASP.NET应用中执行后台任务
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动自由、创新、研究、探索
Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]锐意进取,志存高远.成就梦想,只争朝夕.从你开始,创新世界.【That I exist is a perpetual supprise which is life. Focus on eCommerce】
ASP.NET Core开发系列之后台任务利器Hangfire 使用。
Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序。
可以使用于ASP.NET 应用也可以使用于控制台。Hangfire 只需简单几句代码即可创建新的不同种类的任务。
目前 Hangfire 已经支持.NET Core ,现在就给大家讲解下在ASP.NET Core 里的使用。
Hangfire GitHub:/HangfireIO/Hangfire
官网:http://hangfire.io/&
相关文档介绍:http://docs.hangfire.io/en/latest/
首先我们新建一个ASP.NET Core Web Application
选择模板-》空的模板
然后添加引用:
NuGet 命令行执行
Install-Package Hangfire
添加好引用以后我们就可以来使用。
打开Startup.cs
首先在ConfigureServices 方法中注册服务:
public void ConfigureServices(IServiceCollection services)
services.AddHangfire(r=&r.UseSqlServerStorage("Data Source=.;Initial Catalog=HangfireDUser ID=Password=123456"));
这里是配置数据库,数据库需要确保存在,这里配置的是SQL Server数据库,目前官方支持SQL Server。
然后在Configure 方法中加入HangfireServer及HangfireDashboard:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
loggerFactory.AddConsole();
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseHangfireServer();
app.UseHangfireDashboard();
app.Run(context =&
return context.Response.WriteAsync("Hello from ASP.NET Core!");
然后选择Kestrel执行,访问地址:http://localhost:5000/hangfire
成功运行,下面我们就可以来添加任务了。
app.Map("/index", r =&
r.Run(context =&
//任务每分钟执行一次
RecurringJob.AddOrUpdate(() =& Console.WriteLine($"ASP.NET Core LineZero"), Cron.Minutely());
return context.Response.WriteAsync("ok");
app.Map("/one", r =&
r.Run(context =&
//任务执行一次
BackgroundJob.Enqueue(() =& Console.WriteLine($"ASP.NET Core One Start LineZero{DateTime.Now}"));
return context.Response.WriteAsync("ok");
app.Map("/await", r =&
r.Run(context =&
//任务延时两分钟执行
BackgroundJob.Schedule(() =& Console.WriteLine($"ASP.NET Core await LineZero{DateTime.Now}"), TimeSpan.FromMinutes(2));
return context.Response.WriteAsync("ok");
这里创建任务只是为了方便,我们也可以在初始化的时候创建,也可以在controller 中创建。&
下面我们来执行。
首先访问&http://localhost:5000/index
然后访问&http://localhost:5000/await
最后访问&http://localhost:5000/one
这样任务也就都执行起来了。
Jobs 也就是查看所有的任务,我们可以在节目界面操作运行及删除,很方便。
我们还可以点击任务,查看任务详情。以及任务执行结果。
最终运行一段时间,还有图表展示
Startup.cs 完整代码:
public class Startup
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit /fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
services.AddHangfire(r=&r.UseSqlServerStorage("Data Source=.;Initial Catalog=HangfireDUser ID=Password=123456"));
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
loggerFactory.AddConsole();
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
//GlobalConfiguration.Configuration.UseSqlServerStorage("Data Source=.;Initial Catalog=OrchardCMS;User ID=Password=sa123456");
app.UseHangfireServer();
app.UseHangfireDashboard();
app.Map("/index", r =&
r.Run(context =&
//任务每分钟执行一次
RecurringJob.AddOrUpdate(() =& Console.WriteLine($"ASP.NET Core LineZero"), Cron.Minutely());
return context.Response.WriteAsync("ok");
app.Map("/one", r =&
r.Run(context =&
//任务执行一次
BackgroundJob.Enqueue(() =& Console.WriteLine($"ASP.NET Core One Start LineZero{DateTime.Now}"));
return context.Response.WriteAsync("ok");
app.Map("/await", r =&
r.Run(context =&
//任务延时两分钟执行
BackgroundJob.Schedule(() =& Console.WriteLine($"ASP.NET Core await LineZero{DateTime.Now}"), TimeSpan.FromMinutes(2));
return context.Response.WriteAsync("ok");
app.Run(context =&
return context.Response.WriteAsync("Hello from ASP.NET Core!");
通过Hangfire, 这样我们就可以很方便的在ASP.NET Core 里创建后台任务。而且提供管理界面供我们操作。
阅读(...) 评论()
随笔 - 15589
评论 - 1205

我要回帖

更多关于 hangfire开发教程 的文章

 

随机推荐