1. Introdução

A biblioteca de cron do Golang é uma ferramenta poderosa e fácil de usar que permite agendar tarefas para serem executadas em horários ou intervalos específicos. Ela é modelada após o serviço cron do UNIX, mas é implementada como uma biblioteca independente que pode ser integrada em aplicativos Go. A biblioteca de cron cuida do agendamento baseado em horário, permitindo que você se concentre na tarefa que precisa ser executada.

2. Exemplo

Instalando a biblioteca de cron

Para começar a usar a biblioteca de cron em seu projeto, primeiro você precisa instalá-la usando o comando go get:

go get github.com/robfig/cron/[email protected]

Importar pacote do cron

Após a instalação, você pode importá-lo para o seu programa Go da seguinte maneira:

import "github.com/robfig/cron/v3"

Aqui está um exemplo simples de como configurar um trabalho de Cron que imprime uma mensagem a cada minuto:

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
)

func main() {
	c := cron.New()
	c.AddFunc("0 30 * * * *", func() { fmt.Println("A cada hora e meia") })
	c.AddFunc("@hourly",      func() { fmt.Println("A cada hora") })
	c.AddFunc("@every 1h30m", func() { fmt.Println("A cada hora e trinta") })
	c.Start()
	// As funções são invocadas em sua própria goroutine, de forma assíncrona.
	// As funções também podem ser adicionadas a um Cron em execução
	c.AddFunc("@daily", func() { fmt.Println("Todos os dias") })
	c.Stop()  // Para o agendador (não interrompe os trabalhos em execução).
}

3. Formato da Expressão CRON

Uma expressão cron representa um conjunto de tempos, usando 6 campos separados por espaços.

Nome do Campo Obrigatório? Valores Permitidos Caracteres Especiais Permitidos
Segundos Sim 0-59 * / , -
Minutos Sim 0-59 * / , -
Horas Sim 0-23 * / , -
Dia do mês Sim 1-31 * / , - ?
Mês Sim 1-12 ou JAN-DEC * / , -
Dia da semana Sim 0-6 ou SUN-SAT * / , - ?

4. Caracteres Especiais em Expressões CRON

  • Asterisco ( * ) O asterisco representa todos os valores possíveis para o campo dado. Por exemplo, um asterisco no campo dos minutos significa a cada minuto.
  • Barra ( / ) O caractere de barra é usado para especificar incrementos. Por exemplo, "*/15" no campo dos segundos significa a cada 15 segundos a partir de zero.
  • Vírgula ( , ) O caractere de vírgula é usado para listar vários valores discretos. Por exemplo, "SEG,QUA,SEX" no campo do dia da semana significa que o trabalho será executado às segundas, quartas e sextas-feiras.
  • Hífen ( - ) O hífen denota um intervalo de valores. "9-17" no campo das horas indica a cada hora das 9h às 17h.
  • Ponto de Interrogação ( ? ) O ponto de interrogação pode ser usado nos campos do dia do mês e do dia da semana para significar 'nenhum valor específico', o que é útil quando você precisa especificar um valor para um e não para o outro.

5. Agendamentos Predefinidos

Explicação detalhada dos agendamentos predefinidos disponíveis, mostrados em formato de tabela:

Entrada Descrição Equivalente A
@yearly (ou @annually) Execução anualmente, meia-noite, 1º de Jan. 0 0 0 1 1 *
@monthly Execução mensalmente, meia-noite, primeiro do mês 0 0 0 1 * *
@weekly Execução semanalmente, meia-noite entre sábado/domingo 0 0 0 * * 0
@daily (ou @midnight) Execução diariamente, meia-noite 0 0 0 * * *
@hourly Execução a cada hora, início da hora 0 0 * * * *

6. Intervalos e Agendamento de Intervalos Fixos

Agendar tarefas para serem executadas em intervalos fixos é mais uma funcionalidade poderosa da biblioteca cron. Por exemplo, para agendar uma tarefa que é executada a cada 2 horas:

c.AddFunc("@every 2h", func() { fmt.Println("A tarefa é executada a cada duas horas") })

7. Fusos Horários e Agendamento de Tarefas

A interpretação e o agendamento são feitos no fuso horário local da máquina onde a aplicação Go está em execução. Deve-se ter cuidado durante as mudanças de horário de verão, já que certos horários podem não existir ou ser repetidos.

8. Segurança de Threads e Sincronização

A biblioteca cron é projetada para ser segura para threads e concorrente. É crucial para o chamador manter uma sequência correta de invocações de métodos para evitar condições de corrida. Mecanismos adequados de sincronização devem ser usados quando necessário para garantir que as tarefas sejam agendadas e executadas corretamente.