blexin

Consulenza
Sviluppo e
Formazione IT


Blog

Evolvi la tua azienda

Vediamo insieme come eseguire attività in background con un tool professionale

Schedulare attività con Hangfire

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.

1

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.

2

Integriamo Hangfire nel nostro progetto aggiungendo il relativo pacchetto Nuget.

3

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 come MongoDB oppure soluzioni in-memory come Redis.

4

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.

5

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.

 

6 7

e sul DB.

8

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.

Servizi

Evolvi la tua azienda