Built for Vapor4
💡Vapor3 version is available in
vapor3
branch and from1.0.0
tag
.package(url: "https://github.com/MihaelIsaev/VaporCron.git", from:"2.6.0")
In your target's dependencies add "VaporCron"
e.g. like this:
.target(name: "App", dependencies: ["VaporCron"]),
import VaporCron
let job = try app.cron.schedule("* * * * *") { // or add one more * to launch every second
print("Closure fired")
}
import Vapor
import VaporCron
/// Your job should conform to `VaporCronSchedulable` or `VaporCronInstanceSchedulable`
struct ComplexJob: VaporCronSchedulable {
static var expression: String { "* * * * *" } // or add one more * to launch every second
static func task(on application: Application) -> EventLoopFuture<Void> {
return application.eventLoopGroup.future().always { _ in
print("ComplexJob fired")
}
}
}
let complexJob = try app.cron.schedule(ComplexJob.self)
struct ComplexInstanceJob: VaporCronInstanceSchedulable {
static var expression: String { "* * * * *" } // or add one more * to launch every second
private let application: Application
init(application: Application) {
self.application = application
}
func task() -> EventLoopFuture<Void> {
return application.eventLoopGroup.future().always { _ in
print("ComplexJob fired")
}
}
}
let complexInstanceJob = try app.cron.schedule(ComplexInstanceJob.self)
💡you also could call `req.cron.schedule(...)``
💡💡Scheduled job may be cancelled just by calling
.cancel()
use AsyncVaporCronSchedulable
instead VaporCronSchedulable
use AsyncVaporCronInstanceSchedulable
instead VaporCronInstanceSchedulable
public struct TestCron: AsyncVaporCronSchedulable {
public typealias T = Void
public static var expression: String {
"*/1 * * * *" // or add one more * to launch every 1st second
}
public static func task(on application: Application) async throws -> Void {
application.logger.info("\(Self.self) is running...")
}
}
You could define all cron jobs in your boot.swift
cause here is app: Application
which contains eventLoop
import Vapor
import VaporCron
// Called before your application initializes.
func configure(_ app: Application) throws {
let complexJob = try app.cron.schedule(ComplexJob.self)
/// This example code will cancel scheduled job after 120 seconds
/// so in a console you'll see "Closure fired" three times only
app.eventLoopGroup.next().scheduleTask(in: .seconds(120)) {
complexJob.cancel()
}
}
Some jobs you may want to schedule from some request handler like this
import Vapor
import VaporCron
func routes(_ app: Application) throws {
app.get("test") { req -> HTTPStatus in
try req.cron.schedule(ComplexJob.self).transform(to: .ok)
}
}
import Vapor
import VaporCron
struct Every5MinJob: VaporCronSchedulable {
static var expression: String { "*/5 * * * *" } // every 5 minutes
static func task(on application: Application) -> Future<Void> {
application.db.query(Todo.self).all().map { rows in
print("ComplexJob fired, found \(rows.count) todos")
}
}
}
Please feel free to contribute!