C# - Usando o FluentScheduler


Hoje vou apresentar o FluentScheduler um agendador de tarefas automatizado com interface fluente para a plataforma .NET.

O FluentScheduler pode ser um recurso interessante para agendar tarefas de forma automática na plataforma .NET. Isso abre a possibilidade de usá-lo no lugar de um windows service.

A documentação oficial pode ser consultada neste link: https://github.com/fluentscheduler/FluentScheduler

A primeira coisa a fazer em seu projeto para usar este recurso é incluir uma referência à biblioteca FluentScheduler. Isso pode ser feito via pacote Nuget: FluentScheduler 5.3.0 - NuGet Gallery

Após isso, para começar a usar basta definir a configuração do job em uma classe Registry.

Nota: Um job é uma Action ou uma classe que herda de IJob

Com o registro pronto, você precisará definir o agendamento e inicializar o JobManager. Isso geralmente é feito assim que o aplicativo é carregado (no método Application_Start de um aplicativo Web, no método Main de um Console, etc.).

Vamos ao código...

Crie um projeto Console do tipo .NET Core chamado Cshp_FluentScheduler;

Inclua uma referência no projeto à biblioteca FluentScheduler.

No projeto vamos criar uma classe chamada RegistroTarefasAgendadas onde vamos definir o agendamento das tarefas que desejamos executar.

public class RegistroTarefasAgendadas : Registry
{
   public RegistroTarefasAgendadas()
   {
        Schedule<MeuJob>()
             .NonReentrant()                                          // Permite somente uma instância do job por vez
             .ToRunOnceAt(DateTime.Now.AddSeconds(2))  // Aguarda 2 segundos
             .AndEvery(5).Seconds();                               // Intervalo de 5 segundos

      // Agenda um job para ser executado em uma hora e dia específico
      Schedule(() => Console.WriteLine("Agora são 9:31, dia 9 de fevereiro ")).ToRunEvery(1).Days().At(9, 31);
   }
}

Esta classe herda da classe Registry e nela usamos o método Schedule que permite agendar um job no registro.

A seguir definimos um comportamento específico para o nosso job:

No exemplo o job terá somente uma instância, vai aguardar 2 segundos para iniciar e vai ser executando a cada 5 segundos.

A seguir definimos o agendamento de outro job para ser executado todo o dia em uma hora específica. Aqui estamos executando diretamente o job.

 Schedule(() => Console.WriteLine("Agora são 9:15, dia 9 de fevereiro ")).ToRunEvery(1).Days().At(9, 15);

Agora temos que criar a classe MeuJob onde vamos definir as tarefas a serem executadas:

    public class MeuJob : IJob
    {
        public void Execute()
        {
            // Executa as tarefas agendadas
            Console.WriteLine("São {0:HH:mm:ss} horas" , DateTime.Now);
        }
    }

Esta classe implementa o método Execute da interface IJob.

Para concluir abra o arquivo Program e no método Main() vamos inicializar o job usando a classe JobManager.

Após encerrar o programa estamos parando o Agendador que iniciamos.

        static void Main(string[] args)
        {
            // Inicia o Agendador
            // Define instância do Registro
            JobManager.Initialize(new RegistroTarefasAgendadas());
            // Aguarda pela intervenção do usuário
            Console.WriteLine("Tecle algo...");
            Console.ReadLine();
            // Para o Agendador
            JobManager.StopAndBlock();
        }

Executando o projeto iremos obter o resultado abaixo:

Note a execução da primeira tarefa agendada a cada 5 segundos, e, às 9:31 a execução da segunda tarefa.

Esse foi um exemplo básico de uso da ferramenta. Consultando a documentação você terá outras possibilidades.

Pegue o projeto completo aqui: Cshp_FluentScheduler.zip

"Portanto, não te envergonhes do testemunho de nosso Senhor, nem de mim, que sou prisioneiro seu; antes participa das aflições do evangelho segundo o poder de Deus,
Que nos salvou, e chamou com uma santa vocação; não segundo as nossas obras, mas segundo o seu próprio propósito e graça que nos foi dada em Cristo Jesus antes dos tempos dos séculos;"
2 Timóteo 1:8,9

Referências:


José Carlos Macoratti