Swiftpack.co - MihaelIsaev/VaporCron as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by MihaelIsaev.
MihaelIsaev/VaporCron 2.6.0
⏲ Swift cron scheduler for Vapor
⭐️ 66
🕓 1 week ago
macOS
.package(url: "https://github.com/MihaelIsaev/VaporCron.git", from: "2.6.0")

Mihael Isaev

MIT License Swift 5.1 Swift.Stream


Support this lib by giving a ⭐️

Built for Vapor4

💡Vapor3 version is available in vapor3 branch and from 1.0.0 tag

How to install

Swift Package Manager

.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"]),

Usage

Simple job with closure

import VaporCron

let job = try app.cron.schedule("* * * * *") { // or add one more * to launch every second
    print("Closure fired")
}

Complex job in dedicated struct

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()

Concurrency (swift>=5.5)

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...")
    }
}

Where to define

On boot

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()
    }
}

In request handler

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)
    }
}

How to do something in the database every 5 minutes?

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")
        }
    }
}

Dependencies

Contributing

Please feel free to contribute!

GitHub

link
Stars: 66
Last commit: 1 week ago
jonrohan Something's broken? Yell at me @ptrpavlik. Praise and feedback (and money) is also welcome.

Release Notes

Seconds support
1 week ago

Seconds are optional, just use 6 symbols mask to launch in seconds mode

import VaporCron

let job = try app.cron.schedule("* * * * * *") { // every second
    print("Closure fired")
}

The rest is the same as before

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics