.Net Core怎么使用Hangfire
閑暇無事,寫個帖子記錄生活;
關于第一次使用hangfire使用的demo,該文章比較簡單,因為我現在比較冷;
首先
Q:為什么使用Hangfire?
A:鄙人愚見,使用Hangfire在于三點,1.任務持久化,2.擁有可視化控制臺界面,3.可重試
本文主要講述以下兩個方面:
一、添加及執行定時任務(周期任務)
? ? 使用場景:心跳檢查,定時更新,或者數據同步等需要循環執行的周期性任務
二、客戶端調用添加隊列任務(只執行一次)
? ? 使用場景:信息推送(郵件,短信,微信公眾號,釘釘等等),訂單超時(超過限定時間未付款則取消訂單)等只執行一次的任務,是否延時執行看需求;
廢話說完,回歸主題
一、添加引用NuGet包
Hangfire.AspNetCore? ? 為基礎包,必需
下面三個為數據持久化時持久地址,你用什么就挑那個引用就好了,tips:Hangfire默認的是MSSQL
Hangfire.MemoryStorage? ? 微軟提供的緩存,你程序掛了,這玩意兒也就沒了
Hangfire.MySql.Core? ? 持久化到mysql
Hangfire.Redis.StackExchange? ? 持久化到Redis緩存
二、準備一下我們執行任務的業務代碼
我這里準備一個工具類,也就是MailSmtp發送郵件(嗶嗶一下,該類直接從sugar官網直接copy過來的,特加強調)
然后實現一個消息服務類MessageService
public class MessageService : IMessageService{public void SendEmailMsg(string msg){var mail = new MailSmtp();bool isSuccess = mail.Send("@163.com", "test", "1007425623@qq.com", "哈哈", msg);Console.WriteLine($"發送消息:{msg}");}}?
三、找到Startup.cs,添加如下代碼
public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);//services.AddHangfire(x => x.UseStorage(new MySqlStorage(// //Configuration["ConnectionString"],// new MySqlStorageOptions// {// TransactionIsolationLevel = IsolationLevel.ReadCommitted, // 事務隔離級別。默認是讀取已提交。// QueuePollInterval = TimeSpan.FromSeconds(15), //- 作業隊列輪詢間隔。默認值為15秒。// JobExpirationCheckInterval = TimeSpan.FromHours(1), //- 作業到期檢查間隔(管理過期記錄)。默認值為1小時。// CountersAggregateInterval = TimeSpan.FromMinutes(5), //- 聚合計數器的間隔。默認為5分鐘。// PrepareSchemaIfNecessary = true, //- 如果設置為true,則創建數據庫表。默認是true。// DashboardJobListLimit = 50000, //- 儀表板作業列表限制。默認值為50000。// TransactionTimeout = TimeSpan.FromMinutes(1), //- 交易超時。默認為1分鐘。// TablePrefix = "Hangfire" //- 數據庫中表的前綴。默認為none// })));//services.AddHangfire(x => x.UseStorage(new MemoryStorage()));services.AddHangfire(configuration =>{configuration.UseRedisStorage("");});services.AddTransient<IMessageService, MessageService>();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();app.UseHangfireDashboard(); //使用hangfire面板app.UseHangfireServer(); //啟動hangfire服務RecurringJob.AddOrUpdate<IMessageService>(x => x.SendEmailMsg("================================Hangfire服務端定時任務================================"), Cron.Minutely());}這個也很簡單,就去Hangfire官網,跳到github上看readme就行了
在這里我采用的是使用redis來當我作業持久化的地址,同時開放出我的reids地址,有緣人看到這篇文章的時候可以直接拿著項目跑起來看到效果;
直接F5,在端口后面加上 /hangfire 查看效果;例如:http://localhost:5000/hangfire
這時候,我們的第一個任務《定時任務》(周期任務)就已經完成了;
接下來第二個《隊列任務》(只執行一次),這也很簡單;
四、添加控制器及對應的接口
[Route("api/[controller]/[action]")][ApiController]public class DispatchController : ControllerBase{/// <summary>/// 添加一個任務到隊列并立即執行/// </summary>/// <param name="jobDescriptor"></param>/// <returns></returns>[HttpPost]public JsonResult AddEnqueue(){try{var jobId = string.Empty;jobId = BackgroundJob.Enqueue<IMessageService>(x => x.SendEmailMsg("================================客戶端添加的任務================================"));return new JsonResult(new { Flag = true, Message = $"Job:#{jobId}-已加入隊列" });}catch (Exception ex){return new JsonResult(new { Flag = false, Message = ex.Message });}}/// <summary>/// 添加一個延遲任務到隊列/// </summary>/// <param name="jobDescriptor"></param>/// <returns></returns>[HttpPost]public JsonResult AddSchedule(){try{var jobId = string.Empty;jobId = BackgroundJob.Schedule(() => null, TimeSpan.FromMinutes(1));return new JsonResult(new { Flag = true, Message = $"Job:#{jobId}-已加入隊列" });}catch (Exception ex){return new JsonResult(new { Flag = false, Message = ex.Message });}}/// <summary>/// 添加一個定時任務/// </summary>/// <param name="jobDestriptor"></param>/// <returns></returns>[HttpPost]public JsonResult AddRecurring(){try{var jobId = string.Empty;RecurringJob.AddOrUpdate("", () => null, Cron.Hourly, TimeZoneInfo.Local);return new JsonResult(new { Flag = true, Message = $"Job:已加入隊列" });}catch (Exception ex){return new JsonResult(new { Flag = false, Message = ex.Message });}}/// <summary>/// 刪除一個定時任務/// </summary>/// <param name="jobName"></param>/// <returns></returns>[HttpDelete("DeleteRecurring")]public JsonResult Delete(string jobName){try{RecurringJob.RemoveIfExists(jobName);return new JsonResult(new { Flag = true, Message = $"Job:{jobName}已刪除" });}catch (Exception ex){return new JsonResult(new { Flag = false, Message = ex.Message });}}/// <summary>/// 觸發一個定時任務/// </summary>/// <param name="jobName"></param>/// <returns></returns>[HttpGet("TriggerRecurring")]public JsonResult Trigger(string jobName){try{RecurringJob.Trigger(jobName);return new JsonResult(new { Flag = true, Message = $"Job:{jobName}已觸發執行" });}catch (Exception ex){return new JsonResult(new { Flag = false, Message = ex.Message });}}}什么,代碼看著眼熟?恭喜你,記憶力相當可以,我復制某位大佬的,本文末會注明相關出處
這時候我們再F5啟動,
?
好了,搞定了,本文到此結束,對于本文的類別,更合適的名字應該叫整合吧
demo源碼:https://gitee.com/Jodro/Hangfire
本文相關鏈接:
https://blog.csdn.net/qinyuanpei/article/details/95936781
https://www.hangfire.io
?
總結
以上是生活随笔為你收集整理的.Net Core怎么使用Hangfire的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机术语中的letters表示,let
- 下一篇: 快手算法岗日常实习面试经验