.NET定時任務元件Hangfire解析
專案慢慢就要開工了,很多園友都在問這個事情,看來大夥對這事很上心啊,事情需要一步步的來,儘量寫出一個我們都滿意的專案。以前每次在部落格前面都會扯淡一下,不過很多人都抱怨這樣做不好,加上我這人扯淡起來就停不住,有時候還會很感性的說出一些話,所以以後寫博文儘量少扯淡。(如果博文有不足之處,還望多多指正,我也會及時的修改,如果只是單純的刷存在感,說一些過激的話,那我就不怎麼高興了)
專案中很多時候都會使用到定時任務這樣一個功能需求,在.NET
中對於完成定時任務的技術還是不怎麼多的,.NET Framework
具有“內建”定時器功能,通過System.Timers.Timer
類。
在使用Timer
類需要面對的問題:
計時器沒有持久化機制;
計時器具有不靈活的計劃(僅能設定開始時間和重複間隔,沒有基於日期,時間等);
計時器不使用執行緒池(每個定時器一個執行緒);
計時器沒有真正的管理方案 - 你必須編寫自己的機制,以便能夠記住,組織和檢索任務的名稱等。如果需要在.NET實現定時器的功能,可以嘗試使用以下這款開源免費的元件Quartz.Net
元件。
上面介紹了兩種方式,在這裡就介紹另外一種元件,那就是Hangfire
元件。
一.Hangfire
元件概述
在.NET和.NET Core應用程式中執行後臺處理的簡單方法。無需Windows服務或單獨的程式。由持久儲存支援,儲存方式有sqlserver、redis,mongodb
等等。Hangfire
支援所有型別的後臺任務 - 短時間執行和長時間執行,CPU密集型和I / O密集型,一次性和週期性
。
1.元件特點:
2.元件功能:
上面是對Hangfire
元件背景的一些簡單介紹,下面我們具體來了解一下Hangfire
元件的使用方法。
二.Hangfire
元件使用方法介紹
既然想要學習瞭解一個元件,當然需要知道是怎麼樣取使用,如果不能使用,學著也沒有什麼很大的用處,下面介紹一下Hangfire
元件的一些常用方法。
1.ASP.NET MVC設定方式:
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>");
app.UseHangfireDashboard();
app.UseHangfireServer();
}
GlobalConfiguration
類是配置Hangfire
的首選方式。這是一些方法的入口點,包括來自第三方儲存實現或其他擴充套件的方法。用法很簡單,只需Hangfire
在應用程式初始化類中包含名稱空間,並發現GlobalConfiguration.Configuration
屬性的擴充套件方法
2.控制檯設定方式:
GlobalConfiguration.Configuration
.UseColouredConsoleLogProvider()
.UseSqlServerStorage(@"Server=.\sqlexpress;Database=Hangfire.Sample;Trusted_Connection=True;")
.UseMsmqQueues(@".\Private$\hangfire{0}", "default", "critical");
3.基於佇列的任務處理:
var jobId = BackgroundJob.Enqueue(
() => Console.WriteLine("Fire-and-forget!"));
4.延遲任務執行:
var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
5.迴圈任務執行:
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Recurring!"),
Cron.Daily);
6.繼續在其父作業完成時執行:
BackgroundJob.ContinueWith(
jobId,
() => Console.WriteLine("Continuation!"));
7.批處理方法:
var batchId = BatchJob.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});
8.當父批次中的所有後臺作業完成時,批處理繼續:
BatchJob.ContinueWith(batchId, x =>
{
x.Enqueue(() => Console.WriteLine("Last Job"));
});
9.使用IoC容器:
public class ContainerJobActivator : JobActivator
{
private IContainer _container ;
public ContainerJobActivator (IContainer container )
{
_container = container ;
}}
public override object ActivateJob (Type type )
{
return _container 。Resolve (type );
}
}
在啟動Hangfire
伺服器之前將其註冊為當前作業啟動器。
var container = new Container();
GlobalConfiguration.Configuration.UseActivator(new ContainerJobActivator(container));
...
app.UseHangfireServer();
Hangfire
將作業儲存到持久儲存中,並以可靠的方式處理它們。這意味著你可以中止Hangfire
工作執行緒,解除安裝應用程式域甚至終止程式,工作將被處理。Hangfire
將作業標記為已完成,只有當程式碼的最後一行執行,並知道作業可能會失敗,最後一行。它包含不同的自動重試功能,可以處理程式碼中的儲存錯誤或錯誤。
三.Hangfire
元件核心物件解析
上面介紹了Hangfire
元件的常用方法,Hangfire
元件的功能非常多,這裡就做介紹了,有興趣可以去官網進行檢視api。下面介紹一下Hangfire
元件的一些核心物件,初探Hangfire
元件深層次的問題。
1.RecurringJob.AddOrUpdate()
:
public static void AddOrUpdate(
Expression<Action> methodCall,
string cronExpression,
TimeZoneInfo timeZone = null,
string queue = EnqueuedState.DefaultQueue)
{
var job = Job.FromExpression(methodCall);
var id = GetRecurringJobId(job);
Instance.Value.AddOrUpdate(id, job, cronExpression, timeZone ?? TimeZoneInfo.Utc, queue);
}
該方法用於定期作業在指定的CRON
計劃上觸發多次。該方法具有16個過載,Job.FromExpression(methodCall);
用於獲取基於Job
類的新例項給定的方法呼叫的表示式樹。GetRecurringJobId(job)
方法根據Job
物件獲取對應的JobID
。
2.BackgroundJob.Enqueue()
:
public static string Enqueue([NotNull, InstantHandle] Expression<Action> methodCall)
{
var client = ClientFactory();
return client.Enqueue(methodCall);
}
該方法基於給定的方法呼叫表示式建立一個新的fire-and-forget
作業。該方法接受一個引數,表示將被編組到伺服器的方法呼叫表示式。接下來我們看一下var client = ClientFactory();
方法的具體實現
internal static Func<IBackgroundJobClient> ClientFactory
{
get
{
lock (ClientFactoryLock)
{
return _clientFactory ?? DefaultFactory;
}
}
set
{
lock (ClientFactoryLock)
{
_clientFactory = value;
}
}
}
該屬性定義了一個Func<IBackgroundJobClient>
的泛型委託。該屬性是一個可讀可寫的操作,對ClientFactoryLock
加鎖,確保不發生死鎖情況。
四.總結
上面簡單的介紹了Hangfire
元件的背景和一些簡單的應用,也著重的介紹了一些物件。這個元件的功能很強大,需要了解的地方也較多,這一篇文章不可能全部介紹,用做拋磚引玉的作用。在這裡吐槽一句,微軟最近技術發展太快,很多技術還沒有來得及發展,就有新的技術出來,讓我們這些底層的人著實難受,事物發展有規律,不是以前缺的東西可以在很短的時間就可以補上,還是需要留下足夠的空間。
相關文章
- .NetCore Hangfire任務計劃NetCore
- 十七、.net core(.NET 6)搭建基於Quartz元件的定時排程任務quartz元件
- cronexpr 定時任務解析器
- 十六、.net core(.NET 6)搭建基於Redis的Hangfire定時器Redis定時器
- 定時任務
- SpringTask定時任務Spring
- Oracle定時任務Oracle
- Navicat定時任務
- schedule 定時任務
- 定時任務scheduler
- 定時任務操作
- @Scheduled 定時任務
- Linux 定時任務Linux
- Linux | 定時任務Linux
- Java 定時任務Java
- At 、Crontabl定時任務
- crontab定時任務
- laravel定時任務Laravel
- SpringBoot定時任務Spring Boot
- springboot:定時任務Spring Boot
- 定時任務管理
- ubuntu定時任務Ubuntu
- 定時任務crond服務
- SpringBoot與非同步任務、定時任務、郵件任務Spring Boot非同步
- Linux系統中延時任務及定時任務Linux
- SpringBoot 定時任務ScheduledSpring Boot
- java web定時任務JavaWeb
- springboot(九):定時任務Spring Boot
- SpingBoot @Scheduled定時任務boot
- 定時任務技術
- Golang——Cron 定時任務Golang
- springboot定時任務之旅Spring Boot
- Spring - Task定時任務Spring
- 定時任務總覽
- 石英定時任務-quartzquartz
- Java & Go 定時任務JavaGo
- Linux crontab 定時任務Linux
- Android WorkManager 定時任務Android