Skip to content
Articolo su Hangfire
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
HangfireDemo
.gitattributes
.gitignore
HangfireDemo.sln
README.md

README.md

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 mostrare ciò che ho fatto 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

Andiamo quindi ad integrare 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 il job che andiamo a schedulare è di tipo fire-and-forget che più si appresta al nostro esempio ma con Hangfire possiamo schedulare anche altre tipologie come ad esempio i delayed jobs e cioè jobs schedulati dopo un certo periodo di tempo oppure recurring jobs ovvero jobs che devono essere eseguiti con una certa cadenza. Nella configurazione del nostro esempio abbiamo anche aggiunto la dashboard di Hangfire raggiungibile, nel nostro caso, all'indirizzo [host]:[port]/hangfire. Infatti viene messa a disposizione questa interfaccia grafica con cui possiamo avere innanzitutto una rappresentazione grafica dei jobs ed in più fornisce tante informazioni utili a corredo come ad esempio i jobs correttamente schedulati o quelli falliti. Di seguito vediamo il risultato dello scheduling di dieci jobs sulla dashboard e sul DB.

6 7

e sul DB.

8

È stato molto interessante lavorare a questo task e spero possa risultare tale anche per voi.
Happy Coding!

You can’t perform that action at this time.