Schedule Queues


Mi Problema 🤔

Cuando usamos Vapor Queues para planificar trabajos, la API típica es:

app.queues
    .schedule(MyJob()).hourly().at(0)

Esto planifica cada hora. Si queremos ejecutarlo cada N minutos (p. ej., cada 5, 10 o 15), tenemos que registrar manualmente varios .at(…), lo que acaba en código repetitivo, propenso a errores (minutos duplicados/olvidados) y poco legible.

Mi Solución 🧩

Extraemos un helper sobre Application.Queues que registra el mismo ScheduledJob múltiples veces dentro de la hora usando un stride con paso minutes. Así, con una sola llamada expresamos: “ejecútalo cada N minutos”.

extension Application.Queues {
    func scheduleEvery(
        _ job: ScheduledJob, 
        minutes: Int
    ) {
        for minuteOffset in stride(
            from: 0, 
            to: 60, 
            by: minutes
        ) {
            schedule(job).hourly()
                .at(.init(integerLiteral: minuteOffset))
        }
    }
}

Puntos clave:

  • Usa stride(from: 0, to: 60, by: minutes) para generar los offsets de minuto dentro de la hora.
  • Por cada offset se registra hourly().at(…), evitando duplicar lógica.
  • Si minutes no divide 60, la última ejecución será el mayor múltiplo < 60 (p. ej., minutes = 7 ⇒ 0, 7, 14, …, 56).

Mi Resultado 🎯

Ejemplo de uso:

func configure(_ app: Application) throws {
    app.queues.scheduleEvery(MyJob(), minutes: 5)
}

Una API concisa y autoexpresiva para tareas periódicas cortas:

  • Menos boilerplate: una sola llamada registra todos los disparos.
  • Menos errores: sin listas manuales de .at(…) ni minutos duplicados.
  • Legible y testeable: el patrón es evidente y fácil de verificar.

Keep coding, keep running 🏃‍♂️