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 🏃♂️