hangfire 入門

要求

Hangfire 適用於大多數 .NET 平臺:.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,或任何與 .NET Standard 1.3 兼容的平臺。您可以將它與幾乎任何應用程序框架集成,包括 ASP.NET、ASP.NET Core、控制檯應用程序、Windows 服務、WCF,以及社區驅動的框架,如 Nancy 或 ServiceStack。

存儲

存儲是 Hangfire 保存與後臺作業處理相關的所有信息的地方。類型、方法名稱、參數等所有細節都被序列化並放入存儲中,沒有數據保存在進程的內存中。存儲子系統在 Hangfire 中被很好地抽象出來,可以爲 RDBMS 和 NoSQL 解決方案實現。

這是您必須做出的主要決定,也是開始使用框架之前所需的唯一配置。以下示例顯示如何使用 SQL Server 數據庫配置 Hangfire。請注意,連接字符串可能會有所不同,具體取決於您的環境。

GlobalConfiguration.Configuration
    .UseSqlServerStorage(@"Server=.\SQLEXPRESS; Database=Hangfire.Sample; Integrated Security=True");

客戶端

Client 負責創建後臺作業並將它們保存到 Storage 中。後臺作業是一個應該在當前執行上下文之外執行的工作單元,例如在後臺線程、其他進程中,甚至在不同的服務器上——這一切都可以通過 Hangfire 實現,即使沒有額外的配置。

BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));

請注意,這不是委託,而是表達式樹。Hangfire 不是立即調用該方法,而是序列化類型 (System.Console)、方法名稱 ( WriteLine,帶有所有參數類型以便稍後識別它) 和所有給定的參數,並將其放入 Storage。

服務器

Hangfire Server 通過查詢存儲來處理後臺作業。粗略地說,它是一組後臺線程,它們偵聽 Storage 以獲取新的後臺作業,並通過反序列化類型、方法和參數來執行它們。

您可以將此後臺作業服務器放置在您想要的任何進程中,包括像 ASP.NET 這樣的危險進程——即使您終止了一個進程,您的後臺作業也會在重新啓動後自動重試。因此,在 Web 應用程序的基本配置中,您不再需要使用 Windows 服務進行後臺處理。

using (new BackgroundJobServer())
{
    Console.ReadLine();
}

安裝

Hangfire 作爲幾個 NuGet 包分發,從主要的 Hangfire.Core 開始,它包含所有主要類和抽象。其他包如 Hangfire.SqlServer 提供功能或抽象實現。要開始使用 Hangfire,請安裝主軟件包並選擇可用的存儲空間之一。

Visual Studio 2017 發佈後,出現了一種全新的 NuGet 包安裝方式。所以我放棄了列出安裝 NuGet 包的所有方法,並回退到使用該 dotnet 應用程序幾乎在任何地方都可用的方法。

dotnet add package Hangfire.Core
dotnet add package Hangfire.SqlServer

配置

使用 GlobalConfiguration 類執行配置。它的 Configuration 屬性提供了很多擴展方法,既有來自 Hangfire.Core 的,也有來自其他包的。如果你安裝了一個新的包,不要猶豫,檢查是否有新的擴展方法。

GlobalConfiguration.Configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
    .UseSimpleAssemblyNameTypeSerializer()
    .UseRecommendedSerializerSettings()
    .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions
    {
        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
        QueuePollInterval = TimeSpan.Zero,
        UseRecommendedIsolationLevel = true,
        UsePageLocksOnDequeue = true,
        DisableGlobalLocks = true
    })
    .UseBatches()
    .UsePerformanceCounters();

方法調用可以鏈接起來,因此不需要一次又一次地使用類名。全局配置是爲了簡單起見,幾乎每個 Hangfire 類都允許您指定存儲、過濾器等的覆蓋。在 ASP.NET Core 環境中,全局配置類隱藏在 AddHangfire 方法中。

用法

以下是所有運行中的 Hangfire 組件,作爲打印 “Hello, world!” 的完整工作示例。來自後臺線程的消息。您可以註釋與服務器相關的行,並多次運行該程序——只要您再次取消註釋這些行,就會處理所有後臺作業。

using System;
using Hangfire;
using Hangfire.SqlServer;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseColouredConsoleLogProvider()
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions
                {
                    CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                    SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                    QueuePollInterval = TimeSpan.Zero,
                    UseRecommendedIsolationLevel = true,
                    UsePageLocksOnDequeue = true,
                    DisableGlobalLocks = true
                });

            BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));

            using (var server = new BackgroundJobServer())
            {
                Console.ReadLine();
            }
        }
    }
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UhnysOZgtW2DLCZt8TPcbw