All notable changes to Oban.Pro are documented here.

v0.7.2 — 2021-04-11


  • [Lifeline] The plugin will only run along with the SmartEngine. Running with the BasicEngine is flawed and will cause inadvertent orphan rescues.

    You can either switch to the SmartEngine or remove Lifeline from your plugins.


  • [SmartEngine] Consider the configured prefix for all ack and update options.

v0.7.1 — 2021-04-07


  • [Relay] Restore the ability to use Elixir 1.9 by removing use of the is_map_key guard that wasn't introduced until Elixir 1.10.

  • [SmartEngine] Apply jitter and more selective use of the mutex used for global coordination. The engine also avoids touching or reloading producer records to minimize connection use.

  • [Workflow] Improve deps check performance by using an index powered operator. On instances with millions of jobs this may improve performance ~600x.

v0.7.0 — 2021-04-02

Pluggable Smart Engine

Pro's SmartEngine enables truly global concurrency and global rate limiting by handling demand at the queue level, without any conflict or churn. The engine uses centralized producer records to coordinate with minimal load on the database.

config :my_app, Oban,
  engine: Oban.Pro.Queue.SmartEngine,
  queues: [
    alpha: 1,
    gamma: [global_limit: 1],
    delta: [local_limit: 2, global_limit: 5],
    kappa: [local_limit: 5, rate_limit: [allowed: 30, period: {1, :minute}]],
    omega: [global_limit: 1, rate_limit: [allowed: 500, period: {1, :hour}]]

Check out the SmartEngine Guide for a walkthrough and details.

Relay Plugin

The Relay plugin lets you insert and await the results of jobs locally or remotely, across any number of nodes, i.e. persistent distributed tasks. Once the plugin is running, you can seamlessly distribute oban jobs and await the results synchronously:

alias Oban.Pro.Plugins.Relay

|>{int: &1}))
|> Relay.await_many(timeout: :timer.seconds(1))

# [{:ok, 2}, {:ok, 4}, {:ok, 6}]

See the Relay Plugin Guide for usage and details.

Chunk Worker

Process jobs "broadway style", in groups based on size or a timeout, but with the robust error handling semantics of Oban. Chunking operates at the worker level, allowing many chunks to run in parallel within the same queue.

defmodule MyApp.ChunkWorker do
  use Oban.Pro.Workers.Chunk, queue: :alpha, size: 10, timeout: :timer.seconds(5)

  @impl Chunk
  def process(jobs) do
    |> &1.args)
    |> Business.process_messages()


See the Chunk Worker Guide for details on chunk managment, error handling, and more.

Pro Worker Testing Module

Testing batch, workflows and chunk workers can be tricky due to how they override the perform/1 function. The new Oban.Pro.Testing module provides a process_job/2,3 function that mirrors the functionality of perform_job/2,3 in the base Oban.Testing module.

With process_job/2,3 you can test pro workers in isolation, without worrying about whether a manager is running or the state of a workflow. To start using it, import it into your test case or test file:

import Oban.Pro.Testing

Then test worker logic in isolation:

assert :ok = process_job(MyApp.ProWorker, %{"id" => 1})


  • [Oban.Pro.Plugins.WorkflowManager] This plugin is no longer necessary and can be safely removed from your configuration.

  • Bump Oban dependency to ~> 2.6

v0.6.2 — 2021-03-02


  • [Oban.Pro.Plugins.BatchManager] Drastically speed up batch state checks to prevent timeouts with large batch sizes. The updated query is up to 40x faster under normal workloads.

  • [Oban.Pro.Plugins.DynamicCron] Inject a dynamic cron's name as "cron_name" into inserted job meta to aid in searching, and eventually linking, jobs back to the dynamic cron record.

  • [Oban.Pro.Plugins.DynamicCron] Schedule cron insertion at the top of the next minute, identically to recent changes in Oban.Plugins.Cron.

  • Loosen Oban constraint to allow v2.5.0


  • [Oban.Plugins.Reprioritizer] Rename config to conf in event meta so that it matches all other plugins.

  • Specify a minimum of Elixir v1.9 and avoid features from later Elixir versions, namely Keyword.pop! which was added in Elixir v1.10.

v0.6.1 — 2021-01-28


  • [Oban.Pro.Plugins.Lifeline] Consider fully qualified node identities when rescuing potential orphans. The previous version could erroneously rescue executing jobs.

v0.6.0 — 2021-01-26


  • [Oban.Pro.Plugins.Lifeline] Record fully qualified node identities (combining the Oban supervisor name and the host name). This allows Oban Web to track beats recorded by the same host but different instances.

  • Enhance all plugin span metadata with details such as how many jobs were pruned, inserted, reprioritized, etc. Telemetry events and metadata for all Pro plugins now matches the events from Oban OSS.

  • Bump Oban dependency to ~> 2.4.0 due to CRON parser changes and improved telemetry span events.


  • [Oban.Pro.Plugins.Workflow] Correct typespecs for new_workflow/1 and libgraph related functions.

  • [Oban.Pro.Plugins.DynamicCron] Support inserting and retrieving cron records with a custom prefix. All operations are wrapped in a Multi, which ignored the outer transaction's prefix.

v0.5.3 — 2020-12-09


  • [Oban.Pro.Plugins.DynamicPruner] Consider cancelled jobs that were never attempted when pruning.

v0.5.2 — 2020-11-27


  • [Oban.Pro.Plugins.BatchManager] Check for the correct output from Worker.from_string, fixing callback insertion.

v0.5.1 — 2020-11-06

  • [Oban.Pro.Plugins.DynamicPruner] Allow state overrides when pruning cancelled jobs.

v0.5.0 — 2020-11-06

  • [Oban.Pro.Workers.Workflow] A new worker that composes arbitrary jobs together for directed execution. This allows sequential, fan-out and fan-in workflows that are horizontally distributed and fault tolerant.

    See the Workflow docs for setup and a walk-through with use-cases.

  • Bump Oban dependency to ~> 2.3.0 due to the workflow worker's use of the new meta field in Oban.Job.

v0.4.2 — 2020-10-19

  • [Oban.Pro.Plugins.DynamicPruner] Always delete oldest job when pruning in max_len mode. In max_len mode, when job insertion exceeded job pruning the oldest jobs would persist between prunes.

v0.4.1 — 2020-10-11


v0.4.0 — 2020-10-05


  • [Oban.Pro.Plugins.DynamicCron] The DynamicCron plugin is a replacement for Oban's built in cron scheduler. It supports adding, updating, deleting, pausing and resuming periodic jobs at runtime and boot time. It is an ideal solution for applications that must dynamically start and manage scheduled tasks at runtime.

    See the DynamicCron installation docs for instructions on getting started.

  • [Oban.Pro.Plugins.Lifeline] Add :retry_exhausted option, which will retry exhausted jobs rather than discard them while rescuing.

Breaking Change

  • Emit standardized [:oban, :plugin, :start | :stop | :exception] events for all plugins. Previously, each plugin would emit its own event, which required extensive :telemetry.attach_many calls. Now all plugins have a standard event name with differentiated metatada, including a :plugin key with the module name responsible for emitting the event.

    To upgrade replace any events that used :prune, :lifeline or :reprioritizer with :plugin. For example, [:oban, :prune, :start] is now [:oban, :plugin, :start] with the metadata %{plugin: DynamicPruner}.

v0.3.2 — 2020-08-28

  • [Oban.Pro.Plugins.DynamicPruner] Correctly prune discarded jobs that were cancelled before they were ever attempted.

v0.3.1 — 2020-08-05


  • [Oban.Pro.Workers.Batch] Only invoke batch callbacks that are defined for the current worker.

v0.3.0 — 2020-07-10


  • [Oban.Pro.Plugins.Lifeline] Ignore unknown messages to the plugin to prevent crashes.


  • Bump Oban dependency to 2.0.0

v0.2.1 — 2020-07-01


  • Add handle_exhausted/1 callback to Oban.Pro.Workers.Batch worker. This new callback is triggered when all jobs are either completed or discarded.

v0.2.0 — 2020-06-12


  • Conditional improvements to the BatchManager plugin


  • Bump Oban dependency to 2.0.0-rc.1

v0.1.0 — 2020-06-03

Initial release including these plugins:

  • Oban.Pro.Plugins.BatchManager
  • Oban.Pro.Plugins.DynamicPruner
  • Oban.Pro.Plugins.Lifeline
  • Oban.Pro.Plugins.Reprioritizer

As well as the Oban.Pro.Workers.Batch worker.