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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

hangfire mysql_Hangfire 在.NET Core环境的使用

發(fā)布時間:2024/1/8 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hangfire mysql_Hangfire 在.NET Core环境的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

hf被定義為分布式后臺服務(wù),更加類似job作業(yè)的服務(wù)

做作業(yè)的插件有quartz.net,JobScheduler 等

當(dāng)然,都有一些分別和適用的場景。

1.安裝

需要安裝

Hangfire.Core

Hangfire.AspNetCore

Hangfire.SqlServer

關(guān)于數(shù)據(jù)庫存儲工具,可以根據(jù)場景去選擇安裝

例如mysql 的,需要安裝 Hangfire.MySql (mysql很多第三方寫,所以使用時主要使用環(huán)境)

Redis放入 Hangfire.Redis

redis是官方作者去更新,所以這些使用可以直接看官網(wǎng)

2.配置

asp.net core主要是startup配置DI組件。

官網(wǎng)也有說,列舉一下

// Add Hangfire services.

services.AddHangfire(configuration => configuration

.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)

.UseSimpleAssemblyNameTypeSerializer()

.UseRecommendedSerializerSettings()

.UseSqlServerStorage(Configuration.GetConnectionString("default"), new SqlServerStorageOptions

{

CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),

SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),

QueuePollInterval = TimeSpan.Zero,

UseRecommendedIsolationLevel = true,

UsePageLocksOnDequeue = true,

DisableGlobalLocks = true

}));

services.AddHangfireServer();

關(guān)鍵是這個鏈如何配,UseSqlServerStorage專門讀取hangfire會寫入哪個數(shù)據(jù)庫,如果用現(xiàn)在的業(yè)務(wù)數(shù)據(jù)庫,hangfire的表會寫進(jìn)去的,也可以設(shè)計分開來存放,例如hangfire的DB,集中去管理。當(dāng)然一般小的項(xiàng)目,直接跟業(yè)務(wù)數(shù)據(jù)庫,集中而獨(dú)立的架構(gòu)。

Configure里面的配置

var jobOptions = new BackgroundJobServerOptions

{

Queues = new[] { "back", "front", "default" },//隊(duì)列名稱,只能為小寫

WorkerCount = Environment.ProcessorCount * 5, //并發(fā)任務(wù)數(shù)

ServerName = "conference hangfire1",//服務(wù)器名稱

};

app.UseHangfireServer(jobOptions);//啟動Hangfire服務(wù)

app.UseHangfireDashboard();//啟動hangfire面板

backgroundJobs.Enqueue(() => Console.WriteLine("Hangfire 服務(wù)器已啟動"));

app.UserHangfireAdminService(service); //這個是自己寫的服務(wù)擴(kuò)展

jobOptions如果不配置,會有自己默認(rèn)的名稱,例如服務(wù)器會讀取你當(dāng)前系統(tǒng)的名稱,隊(duì)列那些會讀取對應(yīng)服務(wù)器的程序集名稱。

3.寫服務(wù)

完成了第一二步,這里看這個作業(yè)如何寫

public static class HangfireAdminService

{

private static BackgroundJobServer _server;

///

/// 使用后臺作業(yè)

///

///

///

///

///

public static IApplicationBuilder UserHangfireAdminService(this IApplicationBuilder app,

IConferenceService service)

{

var mcfg = service.MailConfigDefault();

BackgroundJob.Enqueue(() => Console.WriteLine($"測試單個作業(yè): {DateTime.Now}"));

RecurringJob.AddOrUpdate(

() =>

Console.WriteLine($"測試循環(huán)作業(yè): {DateTime.Now}"), Cron.Minutely

);

BackgroundJob.Schedule(() => Console.WriteLine($"測試延遲作業(yè): {DateTime.Now}"), TimeSpan.FromMinutes(1));

return app;

}

}

這個是剛才configure里面的方法。 可以寫成一個IApplicationBuilder的擴(kuò)展方法,加進(jìn)管道

這樣服務(wù)器啟動時,就會啟動里面的服務(wù)。

如果Job作業(yè)需要調(diào)用一個后臺服務(wù),就不能直接在里面_service.Log這樣去調(diào)用方法了,因?yàn)樘幱诓煌木€程方式。所以job調(diào)后臺,可以這樣操作

舉例,這是個api發(fā)郵件的方法

///

/// 發(fā)送郵件

///

///

[HttpPost]

[Route("SendPwd")]

public MsgResult SendPwd(MailConfigDto mail)

{

MsgResult result = new MsgResult(ResultCode.Success);

UserAccountDto user = null;

try

{

MailConfigDto defaultMail = _service.MailConfigDefault();

user = _service.UserDtoById(mail.ExtensionId);

defaultMail.Body = $"用戶注冊成功!登錄名是:{user.UserName},登錄密碼是:{user.Password},注冊類型是:{user.CustomerProfileName}";

defaultMail.Subject = $"用戶:{user.Name}注冊成功!";

List> To = new List>() {

new KeyValuePair(user.Name,user.Email)

};

defaultMail.To = To;

SendEmail(defaultMail);

BackgroundJob.Enqueue((s) =>

s.LogAdd("注冊成功", $"用戶{user.Name}注冊成功,已發(fā)送郵件", OPLog.AdminLogin)

);

}

catch (Exception ex)

{

result = new MsgResult(ResultCode.Exception, ex.Message);

}

return result;

}

關(guān)鍵點(diǎn), BackgroundJob.Enqueue((s) =>s.LogAdd());

Enqueue有個泛型的重載,這里等于是依賴注入的方式,因?yàn)樵谌謅utofac配置過

IConferenceService是指向ConferenceService服務(wù)的,所以這里注入了Enqueue接口,只能是接口,才可以讓DI生效。

so, s.LogAdd代表了接口里面的方法。這樣Enqueue里面就可以調(diào)用后臺自定義的服務(wù)了

4.總結(jié),當(dāng)然還有很多細(xì)節(jié)沒談,不過這樣基本的配置和使用,已經(jīng)滿足軟件的日常用途了。

補(bǔ)充一點(diǎn),常用的三種方式的特點(diǎn),

立即執(zhí)行,完事后會自動銷毀,當(dāng)然,失敗了按默認(rèn)的1分鐘后會重新嘗試,直到成功了

延遲執(zhí)行,這個等于制定了計劃的執(zhí)行時間,這里最少時間是按分鐘算,所以這里不能按用秒甚至毫秒做計算時間的任務(wù)。

循環(huán)執(zhí)行,循環(huán)執(zhí)行獨(dú)立一個方法 RecurringJob。如果大類分,前2個是一個后臺作業(yè)類,這個獨(dú)立的類。循環(huán)執(zhí)行某次進(jìn)程如果失敗了,也不會影響整體的循環(huán)效果,只是失敗的進(jìn)程也會按總體的規(guī)則,1分鐘后重新嘗試失敗的進(jìn)程。

當(dāng)然還有其他的,例如批量處理,延續(xù),批量延續(xù)等

總結(jié)

以上是生活随笔為你收集整理的hangfire mysql_Hangfire 在.NET Core环境的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。