博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在ASP.NET Web API项目中使用Hangfire实现后台任务处理
阅读量:4625 次
发布时间:2019-06-09

本文共 2583 字,大约阅读时间需要 8 分钟。

当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送。由于推送这个具体功能,我们采用了第三方的服务。而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现异步执行,就是希望在后台自动执行,不阻塞前端用户的操作,而且最好能实现失败重试等功能。

经过一些研究比较,我们发现使用Hangfire这个组件可以较好地实现这个需求。为了给大家做一个演示,我这里简化了代码,做一个范例程序。

我在这里不准备详细介绍Hangfire的基本用法,有兴趣的同学们可以参考官方网站   和文档  

 

第一步:创建ASP.NET Web API项目

 

第二步:安装必要的nuget package

打开Nuget Package Manager Console

首先安装Hangfire组件(Core,MemoryStorage),注意,因为后者是依赖前者的,所以我们只需要运行下面的命令即可

Install-Package Hangfire.MemoryStorage

Storage就是存储的意思,Hangfire的后台任务是需要一个地方保存起来,它默认支持SQL Server Storage和MemoryStorage。采用MemoryStorage无疑是最简单的(不需要有任何外部的依赖)。当然,最大的问题就是,因为是放在内存中的,万一网站出现问题重启,那么没有执行完的任务是会消失的。

如果要使用SQL Server的话,可以参考 ,甚至还可以结合MSMQ来提高可用性  

 

接下来为当前项目启用Owin的支持。关于什么是OWin,我这里也不准备多做说明,有兴趣的同学可以参考 :   和 还有  

Install-Package Microsoft.Owin.Host.SystemWeb

 

第三步:添加Owin Startup Class

修改Startup.cs为下面这样的代码

using Hangfire;using Hangfire.MemoryStorage;using Microsoft.Owin;using Owin;[assembly: OwinStartup(typeof(WebApplicationWebApiHangfireSample.Startup))]namespace WebApplicationWebApiHangfireSample{    ///     /// 演示Hangfire的配置    /// 作者:陈希章    ///     public class Startup    {        public void Configuration(IAppBuilder app)        {            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888            //指定Hangfire使用内存存储后台任务信息            GlobalConfiguration.Configuration.UseMemoryStorage();            //启用HangfireServer这个中间件(它会自动释放)            app.UseHangfireServer();            //启用Hangfire的仪表盘(可以看到任务的状态,进度等信息)            app.UseHangfireDashboard();        }    }}

 

 

第四步:实现一个简单的Web API,启动后台任务

using Hangfire;using System;using System.Diagnostics;using System.Web.Http;namespace WebApplicationWebApiHangfireSample.Controllers{    ///     /// 用来公开给前端用户调用的API    /// 作者:陈希章    ///     public class MessageController : ApiController    {        ///         /// 这个是用来发送消息的静态方法        ///         ///         public static void Send(string message)        {            EventLog.WriteEntry("EventSystem", string.Format("这是由Hangfire后台任务发送的消息:{0},时间为:{1}", message, DateTime.Now));        }        public IHttpActionResult Post(string content)        {            //这里可以做一些业务判断或操作                        //然后需要推送的时候,调用下面的方法即可            BackgroundJob.Enqueue(() => Send(content));                      //最后返回(这里是立即返回,不会阻塞)            return Ok();        }    }}

 

第五步:进行测试

我使用Fiddler来模拟客户端调用

我们可以很容易地发起大量的请求,例如下面这样

很快就在Dashboard中看到任务状态(有1000个任务)

但是很快(不到1秒钟的时间),这些任务就全部处理完了

 

我们可以在Windows事件日志中看到消息

以上就是我的简单演示例子。当然,如果还想要实现失败重试,或者更加有意思的一些功能(例如定时发送),可以继续参考官方文档。

这个范例代码可以通过这里下载 

转载于:https://www.cnblogs.com/chenxizhang/p/4740921.html

你可能感兴趣的文章
兼容性
查看>>
自动执行sftp命令的脚本
查看>>
转 Merkle Tree(默克尔树)算法解析
查看>>
网络编程基础之socket编程
查看>>
各种浏览器的user-agent和
查看>>
Restful levels
查看>>
Phonegap移动开发:布局总结(一) 全局
查看>>
Java 变参函数的实现
查看>>
nrf51 SDK自带例程的解读
查看>>
SESSION技术
查看>>
数据结构(五)之直接插入排序
查看>>
SQL函数——LENGTH()和LENGTHB()
查看>>
vim - manual -个人笔记
查看>>
详解Javascript中prototype属性(推荐)
查看>>
angularjs实现首页轮播图
查看>>
Git 对象 和checkout 和stash的笔记
查看>>
团队项目总结2-服务器通信模型和顺序图
查看>>
hdu 1085 Holding Bin-Laden Captive!
查看>>
[周记]8.7~8.16
查看>>
递归定义
查看>>