Jobs#
Jobs (vapor-community/jobs) is a pure Swift queuing system that allows you to offload task responsibility to a side worker.
Some of the tasks this package works well for:
Sending emails outside of the main request thread
Performing complex or long-running database operations
Ensuring job integrity and resilience
Speeding up response time by delaying non-critical processing
Scheduling jobs to occur at a specific time
This package is similar to Ruby Sidekiq. It provides the following features:
Safe handling of
SIGTERMandSIGINTsignals sent by hosting providers to indicate a shutdown, restart, or new deploy.Different queue priorities. For example, you can specify a job to be run on the email queue and another job to be run on the data-processing queue.
Implements the reliable queue process to help with unexpected failures.
Includes a maxRetryCount feature that will repeat the job until it succeeds up until a specified count.
Uses NIO to utilize all available cores and EventLoops for jobs.
Allows users to schedule repeating tasks
Jobs currently has support for the following drivers which interface with the main protocol:
Tip
You should not install this package directly unless you are building a new driver. Install one of the driver packages instead.
Getting Started#
Let’s take a look at how you can get started using Jobs.
Package#
The first step to using Jobs is adding one of the drivers as a dependency to your project in your SPM package manifest file. In this example, we’ll use the Redis driver.
// swift-tools-version:5.1
import PackageDescription
let package = Package(
name: "MyApp",
dependencies: [
/// Any other dependencies ...
.package(url: "https://github.com/vapor-community/jobs-redis-driver.git", from: "1.0.0"),
],
targets: [
.target(name: "App", dependencies: ["JobsRedisDriver", ...]),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App"]),
]
)
Don’t forget to add the module as a dependency in the targets array. Once you have added the dependency, regenerate your Xcode project with the following command:
open Package.swift
Or:
vapor xcode
Config#
The next step is to configure the Jobs in configure.swift.
import Jobs
/// Register Jobs providers
try services.register(JobsProvider())
You can also specify a custom refreshInterval or persistenceKey key, if you’d like:
import Jobs
/// Register Jobs providers
try services.register(JobsProvider(refreshInterval: .seconds(10), persistenceKey: "custom_key", commandKey: "queues"))
Registering a Job#
After modeling a job you must add it to your configuration section like this:
//Register jobs
services.register { container -> JobsConfig in
var jobsConfig = JobsConfig()
jobsConfig.add(try EmailJob(emailService: container.make()))
return jobsConfig
}
Persistence Layer Config#
To register a persistence driver, see the driver’s specific instructions.
Running Workers as Processes#
To start a new queue worker, run vapor run jobs. You can also specify a specific type of worker to run: vapor run jobs --queue emails.
Tip
Workers should stay running in production. Consult your hosting provider to find out how to keep long-running processes alive. Heroku, for example, allows you to specify “worker” dynos like this in your Procfile: worker: Run run jobs
Running Workers in-process#
To run a worker in the same process as your application (as opposed to starting a whole separate server to handle it), call the JobsCommand like this in your boot.swift file:
JobsCommand(application: app).run()
To run scheduled jobs in process, pass the scheduled flag:
JobsCommand(application: app, scheduled: true).run()