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.