hangfire oracle,.net core 之Hangfire任务调度
Hangfire可用作任務(wù)調(diào)度,類似延遲任務(wù)、隊(duì)列任務(wù)、批量任務(wù)和定時(shí)任務(wù)等。
一、nuget Hangfire包
找到Hangfire.AspNetCore和Hangfire.SqlServer包,可以在nuget面板中找到或直接像如下方式安裝:
Install Package?Hangfire.AspNetCore
Install Package?Hangfire.SqlServer
二、在Startup.cs文件中加入以下代碼:
寫一個(gè)Hangfire的擴(kuò)展類,如下所示:
public static classHangFireModule
{public static IApplicationBuilder UseHangfire(thisIApplicationBuilder app)
{
app.UseHangfireServer();
app.UseHangfireDashboard();returnapp;
}public static IServiceCollection AddHangfire(thisIServiceCollection services)
{
services.AddHangfire(x=> x.UseSqlServerStorage(ConfigurationSetting.Configuration["ConnectionString:MyDb_Hangfire"]));returnservices;
}
}
在Startup的ConfigureServices方法中,加入services.AddHangfire();
在Startup的Configure方法中,加入app.UseHangfire();
三、自動(dòng)加入任務(wù)
1.在當(dāng)前模塊中,新創(chuàng)建一個(gè)名為IHangfireTask的接口,將其注冊(cè)為瞬時(shí)生命周期服務(wù)。我們將要實(shí)現(xiàn)的是,從此以后,繼承該接口的類型都會(huì)被自動(dòng)加入到任務(wù)調(diào)度中。
///
///Hangfire任務(wù)接口,任何繼承該接口的都會(huì)加入到Hangfire任務(wù)///
public interfaceIHangfireTask : ITransient {///
///運(yùn)行hangfire任務(wù)///
voidRun();
}
ITransient接口的作用就是,將所有繼承ITransient的接口和類型注冊(cè)為瞬時(shí)生命周期的服務(wù)。
2.在HangFireModule中新增一個(gè)UseHangfireTask擴(kuò)展方法,目的是在Startup的Configure方法中使用,在程序啟動(dòng)的時(shí)候就執(zhí)行該方法。
//運(yùn)行Hangfire任務(wù)
public static void UseHangfireTask(thisIApplicationBuilder app) {//找到繼承了IHangfireTask接口的實(shí)例
IList list = ServiceLocator.Services.GetServices()?.ToList();if (list?.Count > 0) {foreach (var item inlist) {
item.Run();
}
}
}
加入到Startup的Configure方法中:
public voidConfigure(IApplicationBuilder app, IHostingEnvironment env,IServiceProvider serviceProvider)
{
ServiceLocator.SetServices(serviceProvider);if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}else{
app.UseExceptionHandler();
}
app.UseMvc();
app.UseSwagger();
app.UseSwaggerUi();
app.UseHangfire();
app.UseHangfireTask();
}
如此這樣,我們就做到了在程序剛啟動(dòng)時(shí),程序就會(huì)自動(dòng)去找到繼承自IHangfireTask接口的所有類型并運(yùn)行它們的Run()方法。
我們可以在Run()方法中實(shí)現(xiàn)諸如Hangfire的BackgroundJob或RecurringJob等任務(wù)。
接下來(lái)我們就用代碼來(lái)實(shí)現(xiàn)一下!
我們現(xiàn)在想實(shí)現(xiàn)一個(gè)定時(shí)任務(wù),則看如下代碼:
public classRecurringTask:IHangfireTask
{private log4net.ILog log => LogHelper.Log4NetInstance.LogFactory(typeof(RecurringTask));public voidRunTask()
{
log.Info("每分鐘執(zhí)行一次定時(shí)任務(wù)");
}public voidRun()
{
RecurringJob.AddOrUpdate(()=> RunTask(), "* * * * *");
}
}
這里有一個(gè)地方需要注意,在使用RecurringJob或BackgroundJob的時(shí)候,就例如()=> RunTask()這個(gè),RunTask方法的訪問(wèn)修飾符必須是public。如果有必要,盡量在RunTask方法內(nèi)被調(diào)用的其他方法的訪問(wèn)修飾符也定義為public。
在Hangfire中,Cron表達(dá)式包含五個(gè)字段:分鐘、小時(shí)、日期、月份、周,因此定時(shí)任務(wù)最低也只能是一分鐘,沒(méi)有秒數(shù)可供選擇。
接下來(lái)我們看看程序運(yùn)行的結(jié)果:
四、Hangfire的基本任務(wù)
1. BackgroundJob.Enqueue
作用:將一個(gè)任務(wù)放入到某個(gè)持久化的隊(duì)列中并挨個(gè)執(zhí)行,以便程序可以繼續(xù)執(zhí)行其他代碼。該任務(wù)只執(zhí)行一次。
實(shí)現(xiàn):BackgroundJob.Enqueue(() => RunTask());
2.?BackgroundJob.Schedule
作用:將一個(gè)任務(wù)延遲到某個(gè)時(shí)間點(diǎn)后執(zhí)行。
實(shí)現(xiàn):BackgroundJob.Schedule(() => RunTask(), TimeSpan.FromSeconds(30));
即在30秒后才執(zhí)行RunTask()方法。
3.?RecurringJob.AddOrUpdate
作用:重復(fù)執(zhí)行一個(gè)任務(wù),一般用作定時(shí)任務(wù)處理。
實(shí)現(xiàn):RecurringJob.AddOrUpdate(()=> RunTask(), "* * * * *");
即每分鐘都執(zhí)行一次RunTask()方法。
4.?BackgroundJob.ContinueWith
作用:類似工作流的形式,將多個(gè)任務(wù)連接起來(lái)按照順序執(zhí)行。
實(shí)現(xiàn):
string jobId = BackgroundJob.Schedule(() => Console.WriteLine("第一個(gè)任務(wù)"),TimeSpan.FromSeconds(10));
BackgroundJob.ContinueWith(jobId, () => RunTask());
注意:以上RunTask()方法的訪問(wèn)修飾符必須是public。
總結(jié)
以上是生活随笔為你收集整理的hangfire oracle,.net core 之Hangfire任务调度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转载】用Python计算身份证校验码
- 下一篇: 四.树莓派4B-更换系统源