Open Source Web Application Framework for ASP.NET Core
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

5.8 KiB

Gerenciador de Trabalhadores em Segundo Plano Quartz

Quartz é um avançado gerenciador de trabalhadores em segundo plano. Você pode integrar o Quartz com o ABP Framework para usá-lo em vez do gerenciador de trabalhadores em segundo plano padrão. O ABP simplesmente integra o Quartz.

Instalação

É sugerido usar o ABP CLI para instalar este pacote.

Usando o ABP CLI

Abra uma janela de linha de comando na pasta do projeto (arquivo .csproj) e digite o seguinte comando:

abp add-package Volo.Abp.BackgroundWorkers.Quartz

Instalação Manual

Se você deseja instalar manualmente:

  1. Adicione o pacote NuGet Volo.Abp.BackgroundWorkers.Quartz ao seu projeto:

    Install-Package Volo.Abp.BackgroundWorkers.Quartz
    
  2. Adicione o módulo AbpBackgroundWorkersQuartzModule à lista de dependências do seu módulo:

[DependsOn(
    //...outras dependências
    typeof(AbpBackgroundWorkersQuartzModule) //Adicione a nova dependência do módulo
    )]
public class SeuModulo : AbpModule
{
}

A integração do trabalhador em segundo plano do Quartz fornece o adaptador QuartzPeriodicBackgroundWorkerAdapter para adaptar as classes derivadas PeriodicBackgroundWorkerBase e AsyncPeriodicBackgroundWorkerBase. Portanto, você ainda pode seguir o documento de trabalhadores em segundo plano para definir o trabalhador em segundo plano.

Configuração

Veja Configuração.

Criar um Trabalhador em Segundo Plano

Um trabalho em segundo plano é uma classe que deriva da classe base QuartzBackgroundWorkerBase. Por exemplo, uma classe de trabalhador simples é mostrada abaixo:

public class MeuTrabalhadorDeLog : QuartzBackgroundWorkerBase
{
    public MeuTrabalhadorDeLog()
    {
        JobDetail = JobBuilder.Create<MeuTrabalhadorDeLog>().WithIdentity(nameof(MeuTrabalhadorDeLog)).Build();
        Trigger = TriggerBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).StartNow().Build();
    }

    public override Task Execute(IJobExecutionContext context)
    {
        Logger.LogInformation("Executando MeuTrabalhadorDeLog..!");
        return Task.CompletedTask;
    }
}

Nós simplesmente implementamos o método Execute para escrever um log. O trabalhador em segundo plano é um singleton por padrão. Se desejar, você também pode implementar uma interface de dependência para registrá-lo com outro ciclo de vida.

Dica: Adicionar identidade aos trabalhadores em segundo plano é uma boa prática, pois o Quartz distingue trabalhos diferentes com base na identidade.

Adicionar ao BackgroundWorkerManager

Os trabalhadores em segundo plano padrão são adicionados automaticamente ao BackgroundWorkerManager quando a aplicação é inicializada. Você pode definir o valor da propriedade AutoRegister como false, se desejar adicioná-lo manualmente:

public class MeuTrabalhadorDeLog : QuartzBackgroundWorkerBase
{
    public MeuTrabalhadorDeLog()
    {
        AutoRegister = false;
        JobDetail = JobBuilder.Create<MeuTrabalhadorDeLog>().WithIdentity(nameof(MeuTrabalhadorDeLog)).Build();
        Trigger = TriggerBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).StartNow().Build();
    }

    public override Task Execute(IJobExecutionContext context)
    {
        Logger.LogInformation("Executando MeuTrabalhadorDeLog..!");
        return Task.CompletedTask;
    }
}

Se você deseja desabilitar globalmente a adição automática de trabalhadores, você pode desabilitá-la globalmente através das opções AbpBackgroundWorkerQuartzOptions:

[DependsOn(
    //...outras dependências
    typeof(AbpBackgroundWorkersQuartzModule) //Adicione a nova dependência do módulo
    )]
public class SeuModulo : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpBackgroundWorkerQuartzOptions>(options =>
        {
            options.IsAutoRegisterEnabled = false;
        });
    }
}

Tópicos Avançados

Personalizar o ScheduleJob

Suponha que você tenha um trabalhador que é executado a cada 10 minutos, mas devido a um servidor indisponível por 30 minutos, 3 execuções são perdidas. Você deseja executar todas as execuções perdidas quando o servidor estiver disponível novamente. Você deve definir seu trabalhador em segundo plano da seguinte forma:

public class MeuTrabalhadorDeLog : QuartzBackgroundWorkerBase
{
    public MeuTrabalhadorDeLog()
    {
        JobDetail = JobBuilder.Create<MeuTrabalhadorDeLog>().WithIdentity(nameof(MeuTrabalhadorDeLog)).Build();
        Trigger = TriggerBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).WithSimpleSchedule(s=>s.WithIntervalInMinutes(1).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires()).Build();

        ScheduleJob = async scheduler =>
        {
            if (!await scheduler.CheckExists(JobDetail.Key))
            {
                await scheduler.ScheduleJob(JobDetail, Trigger);
            }
        };
    }

    public override Task Execute(IJobExecutionContext context)
    {
        Logger.LogInformation("Executando MeuTrabalhadorDeLog..!");
        return Task.CompletedTask;
    }
}

No exemplo, definimos o intervalo de execução do trabalhador como 10 minutos e definimos WithMisfireHandlingInstructionIgnoreMisfires. Personalizamos o ScheduleJob e adicionamos o trabalhador ao Quartz somente quando o trabalhador em segundo plano não existe.

Mais

Consulte a documentação do Quartz para obter mais informações.