在ASP.NET Web API項目中使用Hangfire實現後臺任務處理

當前項目中有這樣一個需求:由前端用戶的一個操做,須要觸發到不一樣設備的消息推送。因爲推送這個具體功能,咱們採用了第三方的服務。而這個服務調用有時候可能會有延時,爲此,咱們但願將消息推送與用戶前端操做實現異步執行,就是但願在後臺自動執行,不阻塞前端用戶的操做,並且最好能實現失敗重試等功能。css

通過一些研究比較,咱們發現使用Hangfire這個組件能夠較好地實現這個需求。爲了給你們作一個演示,我這裏簡化了代碼,作一個範例程序。html

我在這裏不許備詳細介紹Hangfire的基本用法,有興趣的同窗們能夠參考官方網站 http://hangfire.io/  和文檔 http://docs.hangfire.io/en/latest/ 前端

imageimage

 

第一步:建立ASP.NET Web API項目

imageimage

 

第二步:安裝必要的nuget package

打開Nuget Package Manager Consolesql

image

首先安裝Hangfire組件(Core,MemoryStorage),注意,由於後者是依賴前者的,因此咱們只須要運行下面的命令便可app

Install-Package Hangfire.MemoryStorage

image

Storage就是存儲的意思,Hangfire的後臺任務是須要一個地方保存起來,它默認支持SQL Server Storage和MemoryStorage。採用MemoryStorage無疑是最簡單的(不須要有任何外部的依賴)。固然,最大的問題就是,由於是放在內存中的,萬一網站出現問題重啓,那麼沒有執行完的任務是會消失的。asp.net

若是要使用SQL Server的話,能夠參考 http://docs.hangfire.io/en/latest/configuration/using-sql-server.html ,甚至還能夠結合MSMQ來提升可用性 http://docs.hangfire.io/en/latest/configuration/using-sql-server-with-msmq.html 異步

 

接下來爲當前項目啓用Owin的支持。關於什麼是OWin,我這裏也不許備多作說明,有興趣的同窗能夠參考 : http://www.cnblogs.com/dudu/p/what-is-owin.html  和 http://owin.org/ 還有 http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana 測試

Install-Package Microsoft.Owin.Host.SystemWeb

image

 

第三步:添加Owin Startup Class

image

修改Startup.cs爲下面這樣的代碼網站

using Hangfire;
using Hangfire.MemoryStorage;
using Microsoft.Owin;
using Owin;


[assembly: OwinStartup(typeof(WebApplicationWebApiHangfireSample.Startup))]

namespace WebApplicationWebApiHangfireSample
{
    /// <summary>
    /// 演示Hangfire的配置
    /// 做者:陳希章
    /// </summary>
    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,啓動後臺任務

image

using Hangfire;
using System;
using System.Diagnostics;
using System.Web.Http;

namespace WebApplicationWebApiHangfireSample.Controllers
{
    /// <summary>
    /// 用來公開給前端用戶調用的API
    /// 做者:陳希章
    /// </summary>
    public class MessageController : ApiController
    {
        /// <summary>
        /// 這個是用來發送消息的靜態方法
        /// </summary>
        /// <param name="message"></param>
        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來模擬客戶端調用ui

image

咱們能夠很容易地發起大量的請求,例以下面這樣

image

很快就在Dashboard中看到任務狀態(有1000個任務)

image

可是很快(不到1秒鐘的時間),這些任務就所有處理完了

image

 

咱們能夠在Windows事件日誌中看到消息

image

以上就是個人簡單演示例子。固然,若是還想要實現失敗重試,或者更加有意思的一些功能(例如定時發送),能夠繼續參考官方文檔。

這個範例代碼能夠經過這裏下載  http://files.cnblogs.com/files/chenxizhang/WebApplicationWebApiHangfireSample.zip

相關文章
相關標籤/搜索