Utilização Nativa do Quartz.net no ABP VNext

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:

Tags: ABP-VNext Quartz.net .NET Agendamento de Tarefas CSharp

Publicado em 6-18 20:22