View Source Configuration
Configure your cronjobs in your config/config.exs like this:
config :your_app, YourApp.Scheduler,
jobs: [
# Every minute
{"* * * * *", {Heartbeat, :send, []}},
{{:cron, "* * * * *"}, {Heartbeat, :send, []}},
# Every second
{{:extended, "* * * * *"}, {Heartbeat, :send, []}},
# Every 15 minutes
{"*/15 * * * *", fn -> System.cmd("rm", ["/tmp/tmp_"]) end},
# Runs on 18, 20, 22, 0, 2, 4, 6:
{"0 18-6/2 * * *", fn -> :mnesia.backup('/var/backup/mnesia') end},
# Runs every midnight:
{"@daily", {Backup, :backup, []}, state: :inactive}
]Persistent Storage
Persistent storage can be used to track jobs and last execution times over restarts.
Note: If a storage is present, the jobs from the configuration will not be loaded to prevent conflicts.
config :your_app, YourApp.Scheduler,
storage: Quantum.Storage.ImplementationStorage Adapters
Storage implementations must implement the Quantum.Storage behaviour.
The following adapters are supported:
Release managers
( conform / distillery / exrm / edeliver )
Please note that the following config notation is not supported by release managers.
{"* * * * *", fn -> :anonymous_function end}Named Jobs
You can define named jobs in your config like this:
config :your_app, YourApp.Scheduler,
jobs: [
news_letter: [
schedule: "@weekly",
task: {Heartbeat, :send, [:arg1]},
]
]Possible options:
schedulecron schedule, ex:"@weekly"/"1 * * * *"/{:cron, "1 * * * *"}or{:extended, "1 * * * *"}taskfunction to be performed, ex:{Heartbeat, :send, []}orfn -> :something endrun_strategystrategy on how to run tasks inside of cluster, default:%Quantum.RunStrategy.Random{nodes: :cluster}overlapset to false to prevent next job from being executed if previous job is still running, default:truestateset to:inactiveto deactivate a job or:activeto activate it
It is possible to control the behavior of jobs at runtime.
Override default settings
The default job settings can be configured as shown in the example below. So if you have a lot of jobs and do not want to override the default setting in every job, you can set them globally.
config :your_app, YourApp.Scheduler,
schedule: "* * * * *",
overlap: false,
timezone: :utc,
jobs: [
# Your cronjobs
]Jobs with Second granularity
It is possible to specify jobs with second granularity.
To do this the schedule parameter has to be provided with a {:extended, "1 * * * *"} expression.
config :your_app, YourApp.Scheduler,
jobs: [
news_letter: [
schedule: {:extended, "*/2"}, # Runs every two seconds
task: {Heartbeat, :send, [:arg1]}
]
]GenServer timeout
Sometimes, you may come across GenServer timeout errors esp. when you have
too many jobs or high load. The default GenServer.call timeout is 5000.
You can override this default by specifying timeout setting in configuration.
config :your_app, YourApp.Scheduler,
timeout: 30_000Or if you wish to wait indefinitely:
config :your_app, YourApp.Scheduler,
timeout: :infinityTimezone Support
Please note that Quantum uses UTC timezone and not local timezone.
Before changing the timezone you need to install Tzdata and add the following line in your config file.
config :elixir, :time_zone_database, Tzdata.TimeZoneDatabaseNow you can specify another default timezone, add the following timezone option to your configuration:
config :your_app, YourApp.Scheduler,
timezone: "America/Chicago",
jobs: [
# Your cronjobs
]Valid options are :utc or a timezone name such as "America/Chicago". A full list of timezone names can be downloaded from https://www.iana.org/time-zones, or at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.
Timezones can also be configured on a per-job basis. This overrides the default Quantum timezone for a particular job. To set the timezone on a job, use the timezone key when creating the Quantum.Job structure.
%Quantum.Job{
# ...
timezone: "America/New_York"
}