O hangfire foi construído para facilitar o agendamentos de Jobs e tarefas recorrentes de forma muito fácil. O que o diferencia de outros, por exemplo o Quartz.Net, que é bastante conhecido, é que não precisa de serviços do windows para o seu funcionamento.
No nosso exemplo iremos simular uma tarefa recorrente de envio de e-mail em um aplicativo web ASP.NET MVC, este exemplo é baseado em algo real que usei no trabalho.
Requisitos
- .NET Framework >= 4.5
- Biblioteca de Newtonsoft.Json ≥ 5.0.1
- Banco de dados: - SQL Azure, SQL Server 2008 R2 (incluindo Express) ou Redis.
No nosso exemplo iremos utilizar o SQLServer Express.
Demo
Lembrando que o HangFire pode ser utilizado em sistemas web, sistemas desktop e windows serviçes,
Iremos fazer a demo usando um aplicativo web em ASP.NET MVC simples e criaremos um Job recorrente simulando o envio e emails de 2 em 2 minutos.
Primeiramente crie um aplicativo web ASP.NET MVC e apos isto instale o HangFire usando o Nuget ou via Package Manager Console:
Install-Package HangFire -Version 1.6.17
Com o projeto criado, no Visual Studio, vá até: View->SQL Server Object Explorer:
Clique com o botão direito no segundo DB do SQL Server e vá até as propriedades e copie a connection string:
É neste DB que as tabelas do HangFire serão criadas. A próxima etapa será colocar algumas linhas de código no arquivo startup.cs
para que o HangFire funcione corretamente:
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration
.UseSqlServerStorage("Data Source=(localdb)\v11.0;Initial Catalog=master;
Integrated Security=True;Connect Timeout=30;Encrypt=False;
TrustServerCertificate=True;ApplicationIntent=ReadWrite;
MultiSubnetFailover=False");
app.UseHangfireDashboard();
app.UseHangfireServer();
}
Em UseSqlServerStorage eu coloquei a string de conexão copiada acima, mas em um projeto “real” você deve colocar o nome da string de conexão que estará no arquivo Web.config.
O próximo passo é criar o Job Recorrente, no exemplo criei um controller chamado Home e numa action Index adicionei o seguinte codigo:
public ActionResult Index()
{
RecurringJob.AddOrUpdate(
() => EnviarEmails(),
Cron.MinuteInterval(2));
return View();
}
Não irei implementar o envio do e-mail em si, caso tenha interrese, este link tem as informações necessárias para implementar a função
O código acima cria o job, que ira executar a função EnviarEmails()
, por dois minutos. No lugar de minutos poderia usar segundos, horas, dias e assim por diante.
Quando você executar o site pela primeira vez, algumas tabelas serão criadas pelo HangFire e o Job de envio de emails será criado. Eu deixei o site rodando por um tempo e acessei o DashBoard, adicionando “/ hangfire” ao final da URL e ir em Recurring Jobs, que é onde os jobs recorrentes estão.
O painel do Hangfire mostra informações detalhadas sobre tarefas, filas, status de tarefas e assim por diante.