Agendador de Tarefas em Go (Golang): cron, gocron e robfig/cron
Um agendador de tarefas (task scheduler) é uma ferramenta indispensável para automatizar operações periódicas em aplicações: desde limpeza de cache e envio de notificações até a execução de processadores de dados em segundo plano. No ecossistema Go (Golang), existem várias bibliotecas populares para implementar comportamentos semelhantes ao cron. Neste artigo, vamos explorar três abordagens principais: o pacote integrado cron, o leve gocron e o padrão de facto robfig/cron.
1. Pacote integrado cron (experimental)
A partir do Go 1.19, a biblioteca padrão incluiu um pacote experimental cron em golang.org/x/exp/cron. Ele fornece funcionalidades básicas para executar tarefas agendadas. No entanto, na prática, é raramente utilizado devido à funcionalidade limitada e à falta de suporte para expressões cron complexas (por exemplo, com segundos).
package main
import ( "context" "fmt" "golang.org/x/exp/cron" "time")
func main() { sched := cron.New() // Executar a cada 10 segundos sched.Add("*/10 * * * * *", func() { fmt.Println("Tarefa executada:", time.Now()) }) sched.Start() time.Sleep(30 * time.Second) sched.Stop()}2. Biblioteca robfig/cron — o padrão ouro
A biblioteca github.com/robfig/cron/v3 é a implementação de agendador de tarefas mais popular e madura em Go. Ela suporta:
- Expressões cron padrão (5 campos) com campo opcional de segundos
- Agendamentos predefinidos:
@yearly,@monthly,@weekly,@daily,@hourly - Intervalos:
@every 5m(a cada 5 minutos) - Fusos horários (timezone)
- Tratamento de pânicos através do logger Recovery
- Sistema de logging flexível através da interface
Logger
Instalação
go get github.com/robfig/cron/v3Exemplo básico
package main
import ( "fmt" "github.com/robfig/cron/v3" "time")
func main() { c := cron.New(cron.WithSeconds()) // Ativar suporte a segundos
// A cada minuto aos 30 segundos c.AddFunc("30 * * * * *", func() { fmt.Println("A cada minuto aos 30 segundos:", time.Now().Format("15:04:05")) })
// Todos os dias às 8:00 da manhã c.AddFunc("0 0 8 * * *", func() { fmt.Println("Diariamente às 8:00") })
// A cada 2 horas c.AddFunc("@every 2h", func() { fmt.Println("A cada 2 horas") })
// Segunda-feira às 9:30 c.AddFunc("30 9 * * 1", func() { fmt.Println("Toda segunda-feira às 9:30") })
c.Start() defer c.Stop()
// Aguardar 1 minuto para ver a execução time.Sleep(70 * time.Second)}Sintaxe de expressões cron no robfig/cron
Uma expressão padrão consiste em 5 campos (minutos, horas, dia do mês, mês, dia da semana). Ao ativar a opção cron.WithSeconds(), um sexto campo é adicionado — segundos (0-59).
*— qualquer valor*/5— a cada 5 unidades1,15,30— valores específicos1-10— intervaloL— último (por exemplo, último dia do mês)
3. Biblioteca gocron — simplicidade e legibilidade
github.com/go-co-op/gocron oferece uma interface fluente e de alto nível para criar agendamentos. É ideal se você não precisa de expressões cron complexas, mas apenas de intervalos simples.
Instalação
go get github.com/go-co-op/gocron/v2Exemplo de uso
package main
import ( "fmt" Também na biblioteca
toml++ para C++: guia completo com exemplos práticos
ExcelJS para JavaScript (Node.js): guia completo com exemplos práticos
Geração Swagger/OpenAPI para Swift: ferramentas e bibliotecas
Trabalhando com datas em Rust: visão geral das bibliotecas de tempo e data
gRPC para JavaScript (Node.js): bibliotecas, configuração e exemplos de código