1: Uma classe de utilitário estática
using Quartz;
using Quartz.Impl;
using Quartz.Core;
using System;
using System.Threading.Tasks;
namespace Solucoes.TarefasAgendadas.Host
{
public class AgendadorHelper
{
public static async Task ExecutarTarefa<T>(int intervaloSegundos = 10, int repeticoes = int.MaxValue, string expressaoCron = null) where T : IJob, new()
{
ISchedulerFactory fabricaAgendador = new StdSchedulerFactory();
IScheduler agendador = await fabricaAgendador.GetScheduler();
IJobDetail detalheTarefa = JobBuilder.Create<T>().Build();
TriggerBuilder construtorDisparador = TriggerBuilder.Create();
if (expressaoCron == null)
{
construtorDisparador.WithSimpleSchedule(c => c.WithIntervalInSeconds(intervaloSegundos)
.WithMisfireHandlingInstructionNextWithRemainingCount()
.WithRepeatCount(repeticoes));
}
else
{
construtorDisparador.WithCronSchedule(expressaoCron);
}
var disparador = construtorDisparador.Build();
await agendador.ScheduleJob(detalheTarefa, disparador);
await agendador.Start();
}
}
}
2: Utilização no ABP VNext, implementando a interfaec e herdando de IJob
/// <summary>
/// Serviço de processamento de dados agendados
/// </summary>
[DisallowConcurrentExecution]
public class ProcessadorDadosAgendados : IProcessadorDadosAgendados, ITransientDependency, IJob
{
public async Task Execute(IJobExecutionContext contexto)
{
try
{
await ProcessarInformacoesCadastrais();
await RedisHelper.ObterBancoDados(5).ListRightPushAsync(
ConstantesAgendador.LogContadorAgendador,
JsonConvert.SerializeObject(new LogAgendadorDto {
timestamp = DateTime.Now,
tipo_agendador = 3,
nome_agendador = "Teste do serviço de agendamento"
})
);
}
catch (Exception)
{
// Log de erro poderia ser adicionado aqui
}
}
}
3: Entegração na aplicação
public override void OnApplicationInitialization(ApplicationInitializationContext contexto)
{
var app = contexto.GetApplicationBuilder();
app.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseSwagger();
app.UseSwaggerUI(opcoes =>
{
opcoes.SwaggerEndpoint("v1/swagger.json", "API de Serviços");
opcoes.DocumentTitle = "Documentação da API";
});
app.UseAuthentication();
app.UseMiddleware<MiddlewareAutenticacaoAtual>();
app.UseAuthorization();
app.UseMiddleware<MiddlewareClaimsUsuario>();
app.UseConfiguredEndpoints();
//==========Adicione o seguinte código no final da inicialização do ABP
Task.Factory.StartNew(() =>
{
var idTarefa1 = AgendadorHelper.ExecutarTarefa<ServicoDados>(expressaoCron: "0 15 3,12 * * ? *").Id;
var idTarefa2 = AgendadorHelper.ExecutarTarefa<ServicoCacheRedis>(intervaloSegundos: 10).Id;
var idTarefa3 = AgendadorHelper.ExecutarTarefa<ServicoVerificacaoDados>(expressaoCron: "0 0 1/1 * * ? *").Id;
});
}
4: Recomenda-se implantar o projeto em ambiente Linux Docker para evitar o mecanismo de reciclagem do IIS. Em ambiente de produção, o sistema funcionará de forma estável. Abaixo, um exemplo simples de regisrto de logs para testes: