
Recentemente mi è stata assegnata una user story in cui si richiedeva di integrare Hangfire nel progetto esistente e capire successivamente come creare dei jobs.
Hangfire è una libreria disponibile per .NET e .NET Core, che consente di schedulare jobs in background senza l’ausilio di Windows Service o ulteriori processi esterni. Non conoscendolo, la prima cosa che ho fatto è stato affidarmi completamente alla sua documentazione che sembra fatta molto bene. Le componenti principali di Hangfire sono:
- Client – Responsabile della creazione dei jobs;
- Job Storage – Fornisce un servizio di persistenza per i jobs e le relative informazioni;
- Server – Recupera i dati dallo storage e li processa.

Ma ritorniamo ai task della user story. Per raccontarvi la mia esperienza, ho realizzato una semplice applicazione partendo da un template di Visual Studio. In particolare, ho scelto di creare una ASP.NET Core Web Application con Front-end realizzato in Angular. L’applicazione prevede una semplice Homepage dove è presente un button, la cui pressione non farà altro che scatenare l’incremento di un contatore. Tale azione la trasformeremo in un job che sarà schedulato con Hangfire.

Integriamo Hangfire nel nostro progetto, aggiungendo il relativo pacchetto Nuget.

All’interno dello Startup.cs, registriamo Hangfire tra i servizi ed aggiungiamo alla configurazione l’Hangfire Server.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//...some code
// Add Hangfire services
services.AddHangfire(s => s.UseSqlServerStorage(Configuration.GetConnectionString("HangfireDemo")));
//...some code
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...some code
//Hangfire
app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire");
//...some code
});
Come possiamo notare, quando registriamo Hangfire, viene definito lo storage per i nostri jobs. Per semplicità, si è scelto di utilizzare l’istanza locale di SQLServer, dove è stato creato un nuovo DataBase (HangfireDemoDB), ma è possibile utilizzare anche altri tipi di storage, come Database NoSQL, o MongoDB oppure soluzioni in-memory come Redis.

Successivamente, all’interno del file appsettings.json è stata definita la stringa di connessione al DB.
"ConnectionStrings": {
"HangfireDemo": "Server=(LocalDb)\\MSSQLLocalDB;Database=HangfireDemoDB; Trusted_Connection=True;MultipleActiveResultSets=true"
}
All’avvio dell’applicazione, verranno create diverse tabelle che, come abbiamo detto, conterranno i job e le relative informazioni.

La pressione del bottone “Increment Counter” scatena una richesta HTTP PUT, con la quale passiamo al Backend il valore corrente del nostro counter. Sarà proprio all’interno del Controller che gestisce tale richiesta, che andremo a schedulare i nostri jobs, la cui azione sarà quella di incrementare il valore del counter.
[HttpPut]
[Route("[action]")]
public void SendCurrentCounter([FromBody] Counter currentCounter)
{
counter.Value = currentCounter.Value;
BackgroundJob.Enqueue(() => incrementCounter());
}
public void incrementCounter()
{
counter.Value++;
}
Il job che andiamo a schedulare è di tipo fire-and-forget, che tra quelli disponibili è quello che meglio si presta al nostro esempio. Con Hangfire possiamo schedulare anche job con altre tipologie di scheduling, come ad esempio i delayed jobs e cioè jobs schedulati dopo un certo periodo di tempo oppure recurring jobs, che invece devono essere eseguiti con una certa cadenza temporale.
Nella configurazione del nostro esempio, abbiamo anche aggiunto la dashboard di Hangfire raggiungibile, nel nostro caso, all’indirizzo
[host]:[port]/hangfire
Questa interfaccia grafica ci permette di avere una rappresentazione grafica dei jobs schedulati e ci fornisce tante informazioni utili su di essi, come ad esempio i jobs correttamente schedulati e quelli falliti. Di seguito, vediamo il risultato dello scheduling di dieci jobs sulla dashboard e sul DB.


e sul DB.

Abbiamo solo scalfito la superficie, Hangfire mette a disposizione tante altre funzionalità ed è uno degli strumenti che non può mancare nel vostro arsenale.
Trovare il codice sul mio github a questo indirizzo:
https://github.com/intersect88/HangfireDemo
Alla prossima.