Concluída Primeira Fase do Projeto Agendador de Tarefas do SIGER

Nosso Time de Desenvolvimento Infra-Ferramentas acaba de concluir a primeira fase do Projeto Agendador de Tarefas do ERP SIGER®.

O projeto busca desenvolver um mecanismo de agendamento de tarefas integrado ao SIGER®, dessa forma ao invés de utilizar o Agendador de Tarefas do Windows para rotinas como backups, relatórios e integrações com sistemas de terceiros, o usuário poderá realizar dentro do próprio ERP. O projeto está dividido em quatro fases. A primeira acaba de ser concluída.

A primeira fase teve como objetivo implementarmos o “motor” ou core do agendador de tarefas, implementando seus requisitos essenciais para predição e execução de tarefas futuras. Nesta fase não foi disponibilizada interface gráfica para dar manutenção nas tarefas e nem manutenção nos parâmetros globais do agendador, visto que esse é o escopo da segunda fase, que já está sendo desenvolvido pelo Time.

Requisitos já implementados

Requisitos agendador de tarefas.

O core do agendador foi escrito na linguagem Java. Trabalha, pelo menos em um primeiro momento, com tarefas no formato JSON, cujas operações de inclusão, alteração e exclusão são feitas através da linha de comando.

Nos tópicos a seguir serão detalhados os recursos que já foram implementados e que já estão disponíveis para uso.

Tarefa e disparadores

Uma tarefa representa a entidade básica do agendador de tarefas. Como o próprio nome indica, é algo que será executado de maneira automática pelo servidor em horários pré-estipulados.

Trefas do agendador.

Por sua vez, um disparador configura a periodicidade/recorrência da tarefa, indicando de quanto em quanto tempo o comando será executado. Em outras palavras, o agendador analisa a periodicidade/recorrência indicada no disparador e realiza cálculos para descobrir o horário exato da próxima execução do comando.

Alguns exemplos de disparadores

  • Todos os dias às 15:00
  • Segunda, terça e quarta às 17:00
  • A cada 15 minutos
  • Dias 3, 5 e 10 de cada mês
  • Último dia de cada mês (independentemente de possuir 29, 30 ou 31 dias)
  • Uma única vez em 21/03/2021 às 20:00

Cada tarefa pode conter diversos disparadores, sendo uma relação 1 para N. Esta característica dá grande flexibilidade ao usuário, que pode combinar diversas periodicidades. Por exemplo: um disparador é configurado para executar a cada duas horas, de segunda à sexta. Um segundo disparador da mesma tarefa é configurado para executar todos os sábados ao meio-dia.

Campos disponíveis em cada entidade

Tarefa

  • ID
  • Descrição
  • Comando a ser executado
  • Diretório corrente para execução do comando
  • Lista com N disparadores
  • Flag indicando se executa tarefas em atraso
  • Ação a ser tomada ao disparar tarefa com anterior ainda em execução

Disparador

  • Data/hora da primeira execução
  • Recorrência da tarefa
    • Única
    • Por minuto
    • Diária
    • Semanal
    • Mensal
  • Flag indicando se está habilitada
  • Data/hora de expiração
  • Intervalo, em minutos, para executar a tarefa (somente para recorrência por minuto)
  • Lista com dias da semana para disparar a tarefa (somente para recorrência semanal)
  • Lista com dias do mês para disparar a tarefa (somente para recorrência mensal)

Execução de tarefas em atraso

Tarefas em atraso.

Existe uma configuração especial para indicar se a tarefa permite execução em atraso.

Vamos dar um exemplo prático: suponha que uma tarefa crítica deve ser executada todos os dias, às 12h, mas ocorreu queda de luz e o servidor estava desligado neste momento. Com esta configuração ativada, no exato instante em que o servidor for ligado, o agendador identifica que essa tarefa não executou e dispara sua execução de forma ‘atrasada’.

Caso contrário, com essa flag desmarcada, executaria somente no dia seguinte às 12h.

Ação ao executar nova instância da tarefa

Algumas tarefas podem ser bem longas e levar horas até finalizarem.

Desta forma, pode acontecer de chegar o horário de sua próxima execução, mas a execução anterior ainda estar em andamento. Para isso existem configurações indicando qual é o comportamento esperado:

  • Não iniciar: simplesmente ignora a nova execução para que a anterior siga executando.
  • Iniciar em paralelo: dispara a nova execução em paralelo com a execução anterior.
  • Colocar na fila: insere a nova execução em uma fila, para que execute tão cedo quanto a execução anterior finalizar.
  • Finalizar anterior: aborta a execução anterior e dispara a nova execução

Número máximo de executores

O agendador permite configurar o número de executores disponíveis para execução de tarefas. Isso evita que o servidor fique sobrecarregado, executando muitas tarefas ao mesmo tempo, ou evita que as tarefas utilizem todas as licenças do c-tree disponíveis.

Por padrão, o número de executores é igual ao número de cores do processador – 1. Essa subtração é interessante pois um dos cores já é usado pelo próprio agendador, para controle de tarefas em execução e predição das próximas execuções.