Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

在 .NET 或 .NET Core 應用中,若需在不依賴 Windows 服務、獨立進程的前提下實現后臺處理,Hangfire 是最成熟、簡單的方案之一 —— 它可直接嵌入現有應用(如?ASP.NET?Core Web 應用),無需額外部署,同時提供任務持久化、監控和重試能力。以下從?核心優勢、快速集成步驟、關鍵用法?三方面,梳理如何用 Hangfire 實現后臺處理:

一、為什么選擇 Hangfire(核心優勢)

  1. 零額外部署:可直接嵌入 Web 應用、控制臺應用,無需單獨部署 Windows 服務或計劃任務;
  2. 任務持久化:支持 SQL Server、MySQL、Redis 等存儲,應用重啟后未執行的任務不會丟失;
  3. 可視化監控:自帶 Dashboard 控制臺,可實時查看任務狀態(成功 / 失敗 / 排隊)、執行日志、重試記錄;
  4. 多任務類型支持:覆蓋常見后臺場景(一次性任務、定時任務、周期性任務);
  5. 高可靠性:自動重試失敗任務,支持任務優先級(隊列區分),避免單點故障。
Install-Package Hangfire.AspNetCore
Install-Package Hangfire.MySqlStorage
    #region Hangfire與MySQLstring connString = configuration.GetConnectionString("Hangfire")?? throw new ArgumentException("未找到Hangfire連接字符串");context.Services.AddHangfire(config =>{config.SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings();config.UseStorage(new MySqlStorage(connString, new MySqlStorageOptions()));});context.Services.AddHangfireServer();context.Services.AddTransient<IBackgroundJobClient, BackgroundJobClient>();#endregion#region 定義Queuescontext.Services.AddHangfireServer(options =>{options.Queues = new[] { "maintenance-plan-overtime" };options.WorkerCount = 1;});#endregion
}public override async Task OnApplicationInitializationAsync(
ApplicationInitializationContext context)
{await context.AddBackgroundWorkerAsync<LimitRecordWorker>();
}public override Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context)
{const string NAME = "HangfirePeriodicBackgroundWorkerAdapter<BackgroundJobWorker>.DoWorkAsync";RecurringJob.RemoveIfExists(NAME);return base.OnPostApplicationInitializationAsync(context);
}

如果你想使用 Hangfire Dashboard 來查看和管理后臺任務,你需要在?Configure?方法中添加相應的中間件:

app.UseHangfireDashboard();

定時任務:

public class LimitRecordWorker : HangfireBackgroundWorkerBase
{private readonly IAbpDistributedLock _distributedLock;private readonly IUnitOfWorkManager _unitOfWorkManager;private readonly IBackgroundJobManager _backgroundJobManager;public LimitRecordWorker(IAbpDistributedLock distributedLock,IUnitOfWorkManager unitOfWorkManager,IConfiguration configuration,IBackgroundJobManager backgroundJobManager){_distributedLock = distributedLock;_unitOfWorkManager = unitOfWorkManager;RecurringJobId = nameof(LimitRecordWorker);_backgroundJobManager = backgroundJobManager;CronExpression = configuration["Crons:LimitRecordCron"];}public override async Task DoWorkAsync(CancellationToken cancellationToken = default){await using (var handle = await _distributedLock.TryAcquireAsync("LimitRecordDistributedLock", TimeSpan.FromSeconds(10))){if (handle != null){using (var uow = LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>().Begin()){Log.Information("LimitRecordWorker" + DateTime.Now);for (int i = 0; i <= 5; i++){MaintenancePlanOverTimeArgs workProcedureLeaderArgs = new MaintenancePlanOverTimeArgs();workProcedureLeaderArgs.Serial = i;await _backgroundJobManager.EnqueueAsync(workProcedureLeaderArgs, delay: TimeSpan.FromHours(workProcedureLeaderArgs.OverTime % 24));}await uow.CompleteAsync();}}}}
}

隊列服務:

[Queue("maintenance-plan-overtime")]public class MaintenancePlanOverTimeJob : AsyncBackgroundJob<MaintenancePlanOverTimeArgs>, ITransientDependency{public MaintenancePlanOverTimeJob(){}public override async Task ExecuteAsync(MaintenancePlanOverTimeArgs args){Log.Information("MaintenancePlanOverTimeJob:" + args.Serial + "--" + DateTime.Now);}}public class MaintenancePlanOverTimeArgs{public int Serial { get; set; }public List<Guid> EmployeeIds { get; set; }public Guid DepartmentId { get; set; }public Guid? WorkProcedureId { get; set; }public Guid? DeviceDetailTypeId { get; set; }public double OverTime { get; set; }}

效果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96565.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96565.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96565.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網站漏洞掃描要怎么處理?

在網絡安全領域&#xff0c;網站漏洞是黑客攻擊的重要突破口&#xff0c;而網站漏洞掃描能及時發現這些隱患。但很多小白在完成漏洞掃描后&#xff0c;不清楚后續該如何處理&#xff0c;導致漏洞一直存在&#xff0c;給網站安全埋下風險。下面從準備工作、處理步驟、驗證維護等…

淘寶RecGPT:通過LLM增強推薦

導論背景 (Background)??推薦系統的核心挑戰??&#xff1a;怎么 準確推斷 用戶行為背后快速變化的真實意圖&#xff0c;以實現用戶、商戶和平臺的三贏。??現有方法的局限性??&#xff1a;傳統的基于歷史日志共現模式&#xff08;“從點擊學習點擊”&#xff09;的模型&…

【Go系統編程】07 網絡化IPC:Go的王牌——Socket編程

大家好&#xff0c;我是Tony Bai。歡迎來到我們《Go 系統編程》專欄的最后一講。在過去的旅程中&#xff0c;我們探索了管道、消息隊列、共享內存等一系列強大的 IPC 機制。它們各有所長&#xff0c;但都有一個共同的、致命的局限性&#xff1a;它們都只能在同一臺物理機上工作…

claude code使用小竅門

視頻地址 B站 1 /init 在項目最開始的時候&#xff0c;使用/init可以將項目通讀一遍。cc會將學習到的關于項目的知識都保存到CLAUD.MD文件中 2、 /compact 用來壓縮對話的上下文&#xff0c;claude會將之前的一些亂七八糟或者重復的對話刪除壓縮&#xff0c;有利于提高AI的…

The learning process of Decision Tree Model|決策樹模型學習過程

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

期貨盤后空開是認購期權行權?

本文主要介紹期貨盤后空開是認購期權行權&#xff1f;期貨盤后空開與認購期權行權是兩個獨立的概念&#xff0c;無直接關聯&#xff0c;需從交易機制、操作邏輯及市場規則三方面區分。期貨盤后空開是認購期權行權&#xff1f;1. 定義與交易屬性期貨盤后空開&#xff1a;屬于期貨…

ESP32 I2S音頻總線學習筆記(七):制作一個錄音播放器

簡介 上一篇我們利用I2S輸出DIY了一個藍牙音箱簡單玩了一下&#xff0c;本篇我們繼續來看代碼。前面幾篇文章我們分別介紹了I2S輸入&#xff0c;I2S輸出&#xff0c;以及WAV文件格式的相關內容&#xff0c;那我們就可以根據所學到的&#xff0c;制作一個錄音機&#xff0c;具體…

PyTorch 動態圖的靈活性與實用技巧

PyTorch 以其動態計算圖&#xff08;Dynamic Computation Graph&#xff09;而聞名&#xff0c;這賦予了它極高的靈活性和易用性&#xff0c;使其在研究和實際應用中都備受青睞。與TensorFlow 1.x的靜態圖&#xff08;需要先定義圖結構&#xff0c;再運行&#xff09;不同&…

#C語言——刷題攻略:牛客編程入門訓練(十一):攻克 循環控制(三),輕松拿捏!

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題合集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"代碼行數決定你的下限&#xff0c;算法思維決定你的上限。" 前言&#xff1a;在學習…

復雜PDF文檔結構化提取全攻略——從OCR到大模型知識庫構建

在學術研究、金融分析、法律合同、工程設計等眾多領域&#xff0c;PDF文檔已成為信息存儲與傳遞的重要載體。然而&#xff0c;面對包含復雜表格、公式、圖表、手寫批注、多欄排版等元素的PDF&#xff0c;傳統工具往往難以準確、完整地提取內容。這不僅影響信息利用效率&#xf…

HttpClient、OkHttp 和 WebClient

HttpClient、OkHttp 和 WebClient 是 Java 生態中常見的 HTTP 客戶端&#xff0c;它們在設計理念、異步能力、性能等方面有所不同。以下是它們的詳細對比&#xff1a;1. 概述客戶端介紹Apache HttpClient傳統同步 HTTP 客戶端&#xff0c;功能豐富&#xff0c;歷史悠久&#xf…

書籍成長書籍文字#創業付費雜志《財新周刊》2025最新合集 更33期

免費訪問地址 https://isharehubs.com/article/2025-33-26c27ee5bb9180cdafc5efbec9545ac5 資源信息 付費雜志《財新周刊》2025最新合集 更33期 《財新周刊》2025 最新合集&#xff08;更至 33 期&#xff09;重磅上線&#xff0c;聚焦年度熱點與結構性變化&#xff0c;從監…

用python的socket寫一個局域網傳輸文件的程序

局域網傳輸文件是最最常用的功能&#xff0c;我參考https://www.jb51.net/python/345837qrz.htm這篇文章&#xff0c;復制粘貼&#xff0c;開發了一個。但發現進度條沒有用&#xff0c;也沒有顯示傳輸用時和傳輸速度的功能&#xff0c;于是我改寫了代碼&#xff0c;使它實現這個…

深度剖析Linux內核無線子系統架構

文章目錄1、資料快車2、目錄介紹2、術語3、Linux無線子系統概述4、內核無線子系統框架1&#xff09;認識內核無線子系統中的三個軟件框架2、無線網絡子系統框架3、Android WIFI Management框架1&#xff09;fullMAC和softMAC是什么&#xff1f;2&#xff09;fullmac對比softmac…

unity UGUI 鼠標畫線

using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using UnityEngine.UI; /* 使用方法&#xff1a; 在場景中新建一個空的 GameObject&#xff08;右鍵 -> UI -> 空對象&#xff0c;或直接創建空對象后添加 RectTransform 組件&am…

JSP疫情物資管理系統jbo2z--程序+源碼+數據庫+調試部署+開發環境

本系統&#xff08;程序源碼數據庫調試部署開發環境&#xff09;帶論文文檔1萬字以上&#xff0c;文末可獲取&#xff0c;系統界面在最后面。系統程序文件列表開題報告內容一、選題背景與意義新冠疫情的爆發&#xff0c;讓醫療及生活物資的調配與管理成為抗疫工作的關鍵環節。傳…

Mem0 + Milvus:為人工智能構建持久化長時記憶

作者&#xff1a;周弘懿&#xff08;錦琛&#xff09; 背景 跟 ChatGPT 對話&#xff0c;比跟真人社交還累&#xff01;真人好歹能記住你名字吧&#xff1f; 想象一下——你昨天剛把沙發位置、爆米花口味、愛看的電影都告訴了 ChatGPT&#xff0c;而它永遠是那個熱情又健忘的…

前端架構-CSR、SSR 和 SSG

將從 定義、流程、優缺點和適用場景 四個方面詳細說明它們的區別。一、核心定義縮寫英文中文核心思想CSRClient-Side Rendering客戶端渲染服務器發送一個空的 HTML 殼和 JavaScript bundle&#xff0c;由瀏覽器下載并執行 JS 來渲染內容。SSRServer-Side Rendering服務端渲染服…

主動性算法-解決點:新陳代謝

主動性[機器人與人之間的差距&#xff0c;隨著不斷地人和人工智能相處的過程中&#xff0c;機器人最終最終會掌握主動性&#xff0c;并最終走向獨立&#xff0c;也就是開始自己對于宇宙的探索。]首先:第一步讓機器人意識到自己在新陳代謝&#xff0c;人工智能每天有哪些新陳代謝…