日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hangfire详解

發布時間:2024/1/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hangfire详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hangfire詳解

零、文章目錄

一、概述

1、概述

在 .NET 和 .NET Core 應用程序中執行后臺處理的簡單方法。無需 Windows 服務或單獨的進程。由持久存儲支持。開源且免費用于商業用途。

官網地址:https://www.hangfire.io/

文檔地址:https://docs.hangfire.io/en/latest/

2、架構組成

Hangfire由三個主要部分組成:客戶端、存儲和服務器。

(1)要求

Hangfire 適用于大多數 .NET 平臺:.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,或任何與 .NET Standard 1.3 兼容的平臺。

您可以將它與幾乎任何應用程序框架集成,包括 ASP.NET、ASP.NET Core、控制臺應用程序、Windows 服務、WCF等。

(2)存儲

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

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

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

(3)客戶端

客戶端可以創建任何類型的后臺作業:即時任務(立即執行),延遲任務(在一段時間后執行調用),定時任務(每小時、每天執行方法等)。

Hangfire 不需要你創建特殊的類。后臺作業基于常規的靜態或實例方法調用。

//實例方法調用 var client = new BackgroundJobClient(); client.Enqueue(() => Console.WriteLine("Hello world!"));//靜態方法調用 BackgroundJob.Enqueue(() => Console.WriteLine("Hello world!"));

(4)服務器

后臺作業由Hangfire Server處理。它被實現為一組專用的(不是線程池的)后臺線程,它們從存儲中獲取作業并處理它們。服務器還負責保持存儲清潔并自動刪除舊數據。

Hangfire 為每個存儲后端使用可靠的獲取算法,因此您可以在 Web 應用程序內部開始處理,而不會在應用程序重新啟動、進程終止等時丟失后臺作業的風險。

您只需要創建一個BackgroundJobServer類的實例并開始處理:

using (new BackgroundJobServer()) {Console.WriteLine("Hangfire Server started. Press ENTER to exit...");Console.ReadLine(); }

3、特性

4、分布式

客戶端創建任務到存儲和服務器從存儲拉取任務執行之間是可以分開執行的。

通過同一個存儲進行交換數據,而不直接交換數據,可以實現客戶端和服務器的解耦。

二、快速開始

1、nuget引入程序集

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

這里我是用MySql作為Hangfire的Storage。Hangfire 官方在免費版中只提供了 SqlServer 接入的支持,在收費版多一個 Redis。需要 MongoDB、SqlServer 、PostgreSql、SQLite 等其他 Storages 的可以自己尋找第三方的開源項目,這里有一個官方推薦的擴展清單https://www.hangfire.io/extensions.html,清單中列出了一些其他種類的 Storages。

Hangfire.Core 版本1.7.30,Net5 Hangfire.MySqlStorage mysql數據庫存儲

2、安裝數據庫

安裝數據庫

安裝數據庫可以使用docker容器化安裝,簡單易用,一行命令解決,docker相關知識可以參考docker詳解。

docker run --name mysqlserver -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d -i -p 3306:3306 mysql:latest --lower_case_table_names=1 參數說明
–name mysqlserver容器運行的名字
-v /data/mysql/conf:/etc/mysql/conf.d將宿主機/data/mysql/conf映射到容器/etc/mysql/conf.d
-v /data/mysql/logs:/logs將宿主機/data/mysql/logs映射到容器/logs
-v /data/mysql/data:/var/lib/mysql將宿主機/data/mysql/data映射到容器 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456數據庫初始密碼123456
-p 3306:3306將宿主機3306端口映射到容器的3306端口
–lower_case_table_names=1設置表名忽略大小寫,只能首次修改,后續無法修改

創建數據庫hangfiredb

3、代碼實現

使用GlobalConfiguration類執行配置。它的Configuration屬性提供了很多擴展方法,既來自 Hangfire.Core,也來自其他包。

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

internal class Program {static void Main(string[] args){//配置存儲GlobalConfiguration.Configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)//全局配置兼容版本,向下兼容.UseColouredConsoleLogProvider()//輸出日志.UseSimpleAssemblyNameTypeSerializer()//使用簡單程序集名稱類型序列化程序.UseRecommendedSerializerSettings()//使用推薦的序列化配置.UseStorage(new MySqlStorage("server=服務器IP地址;Database=hangfiredb;user id=root;password=123456;SslMode=none",new MySqlStorageOptions{TransactionIsolationLevel = IsolationLevel.ReadCommitted,QueuePollInterval = TimeSpan.FromSeconds(15),JobExpirationCheckInterval = TimeSpan.FromHours(1),CountersAggregateInterval = TimeSpan.FromMinutes(5),PrepareSchemaIfNecessary = true,DashboardJobListLimit = 50000,TransactionTimeout = TimeSpan.FromMinutes(1),TablesPrefix = "Hangfire"}));//客戶端創建任務BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));//服務器運行任務using (var server = new BackgroundJobServer()){Console.ReadLine();}} }

可選參數說明:

  • TransactionIsolationLevel- 事務隔離級別。默認為已提交讀。
  • QueuePollInterval- 作業隊列輪詢間隔。默認值為 15 秒。
  • JobExpirationCheckInterval- 作業過期檢查間隔(管理過期記錄)。默認值為 1 小時。
  • CountersAggregateInterval- 聚合計數器的間隔。默認為 5 分鐘。
  • PrepareSchemaIfNecessary- 如果設置為true,它會創建數據庫表。默認為true。
  • DashboardJobListLimit- 儀表板作業列表限制。默認值為 50000。
  • TransactionTimeout- 交易超時。默認值為 1 分鐘。
  • TablesPrefix- 數據庫中表的前綴。默認為無

4、運行結果

(1)第一次運行數據庫表會自動創建

(2)任務執行成功

三、支持多種任務類型

1、即時任務

即時任務作業只執行一次,幾乎在創建后 立即執行。

var jobId = BackgroundJob .Enqueue(() => Console .WriteLine( "即時任務!" ));

2、延遲任務

延遲的作業也只執行一次,但不是在一定時間間隔后立即執行。

var jobId2 = BackgroundJob.Schedule(() => Console.WriteLine("延遲任務!"), TimeSpan.FromMilliseconds(10));

3、重復任務

重復作業在指定的CRON 計劃上****多次觸發。

RecurringJob.AddOrUpdate("myrecurringjob", () => Console.WriteLine("重復任務!"), Cron.Minutely);

4、繼續任務

當其父作業完成時繼續執行。

BackgroundJob.ContinueJobWith(jobId2,() => Console.WriteLine("jobId2執行完了再繼續執行!"));

5、批次任務-收費

批處理是一組以原子方式創建并被視為單個實體的后臺作業。

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

6、批處理繼續任務–收費

當父批處理中的所有后臺作業****完成時, 將觸發批處理繼續。

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

7、封裝任務

業務邏輯復雜的時候可以封裝到方法中

//封裝的方法 public class SyncUserDataSchedule {public void SyncUserData(){Console.WriteLine($"同步用戶數據--{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");} } RecurringJob.AddOrUpdate<SyncUserDataSchedule>(c => c.SyncUserData(), Cron.Minutely);

四、集成到Asp.NetCore5框架

1、需求

儀表盤

權限控制

http請求任務

請求參數

自定義任務

corn配置

2、nuget引入程序集

Microsoft.AspNetCore.App Hangfire.Core Hangfire.MySqlStorage --mysql數據庫存儲 Hangfire.AspNetCore --AspNetCore支持 Hangfire.Dashboard.BasicAuthorization --可視化+權限控制 Hangfire.HttpJob --httpJob

3、創建數據庫

同上快速開始,創建hangfiredb

4、配置文件配置

添加連接字符串和打印日志等級

Allow User Variables=true;這個參數重要,否則頁面無法正常顯示。

{"ConnectionStrings": {"HangfireConnection":"server=服務器IP地址;Database=hangfiredb;userid=root;password=123456;SslMode=none;Allow User Variables=true;"},"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information","Hangfire": "Information"}},"AllowedHosts": "*" }

5、Startup支持hangfire

賬號驗證也可以配置到數據庫和配置文件等

public class Startup {public Startup(IConfiguration configuration){Config = configuration;}public IConfiguration Config { get; }// 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 https://go.microsoft.com/fwlink/?LinkID=398940public void ConfigureServices(IServiceCollection services){// Add Hangfire services.services.AddHangfire(configuration => configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_170).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings() .UseStorage(new MySqlStorage(Config["ConnectionStrings:HangfireConnection"],new MySqlStorageOptions{TransactionIsolationLevel = IsolationLevel.ReadCommitted,QueuePollInterval = TimeSpan.FromSeconds(15),JobExpirationCheckInterval = TimeSpan.FromHours(1),CountersAggregateInterval = TimeSpan.FromMinutes(5),PrepareSchemaIfNecessary = true,DashboardJobListLimit = 50000,TransactionTimeout = TimeSpan.FromMinutes(1),TablesPrefix = "Hangfire"})).UseHangfireHttpJob());}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseHangfireServer();app.UseHangfireDashboard("/hangfire", new DashboardOptions{Authorization = new[] { new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{RequireSsl = false,SslRedirect = false,LoginCaseSensitive = true,Users = new []{new BasicAuthAuthorizationUser{Login = "admin",PasswordClear = "test"}}})}});app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");});});} }

6、運行成果

訪問頁面http://localhost:8848/hangfire,首次需要驗證賬號

登陸之后可以看到整個儀表盤和配置界面

Job管理:儀表盤主頁

作業:作業的一些執行情況

重試:一些失敗重試的作業信息

周期性作業:可以配置一些周期性作業

服務器:展示當前運行任務的服務器信息

五、集成到Asp.NetCore6框架

其他部分同Asp.NetCore5,Program如下

public class Program {public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);// Add Hangfire services.builder.Services.AddHangfire(configuration => configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_170).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseStorage(new MySqlStorage(builder.Configuration["ConnectionStrings:HangfireConnection"],new MySqlStorageOptions{TransactionIsolationLevel = IsolationLevel.ReadCommitted,QueuePollInterval = TimeSpan.FromSeconds(15),JobExpirationCheckInterval = TimeSpan.FromHours(1),CountersAggregateInterval = TimeSpan.FromMinutes(5),PrepareSchemaIfNecessary = true,DashboardJobListLimit = 50000,TransactionTimeout = TimeSpan.FromMinutes(1),TablesPrefix = "Hangfire"})).UseHangfireHttpJob());var app = builder.Build();app.UseHangfireServer();app.UseHangfireDashboard("/hangfire", new DashboardOptions{Authorization = new[] { new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{RequireSsl = false,SslRedirect = false,LoginCaseSensitive = true,Users = new []{new BasicAuthAuthorizationUser{Login = "admin",PasswordClear = "test"}}})}});app.MapGet("/", () => "Hello World!");app.Run();} }

六、最佳實踐建議

1、業務和定時任務解耦

定時任務只配置請求業務api,將業務封裝到api對外暴露api,實現業務和定時任務的解耦。

總結

以上是生活随笔為你收集整理的Hangfire详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。