Loading...
Loading...
Oban background job patterns - workers, queues, error handling, testing. Load when working with background jobs.
npx skill4agent add oliver-kriska/claude-elixir-phoenix obangrep -E "oban_pro|oban_web" mix.exs
grep -r "use Oban.Pro.Worker" lib/references/oban-pro-basics.md| Standard Oban | Oban Pro |
|---|---|
| |
| |
| |
| |
references/oban-pro-basics.md%{user_id: 1}%{user: %User{}}:ok{:error, _}{:cancel, _}{:snooze, _}%{"user_id" => id}%{user_id: id}defmodule MyApp.Workers.ExampleWorker do
use Oban.Worker,
queue: :default,
max_attempts: 5,
unique: [period: {5, :minutes}, keys: [:entity_id]]
@impl Oban.Worker
def perform(%Oban.Job{args: %{"entity_id" => id}}) do
case process(id) do
{:ok, _} -> :ok
{:error, :not_found} -> {:cancel, "Entity not found"}
{:error, :rate_limited} -> {:snooze, {5, :minutes}}
{:error, reason} -> {:error, reason}
end
end
end| Return | State | Behavior |
|---|---|---|
| | Success |
| | Success with value |
| | Retry with backoff |
| | Stop permanently |
| | Delay and retry |
dispatch_cooldownuse Oban.Testing, repo: MyApp.Repo
# Assert enqueued
assert_enqueued worker: MyApp.Worker, args: %{id: 1}
# Execute and verify
assert :ok = perform_job(MyApp.Worker, %{id: 1})| Wrong | Right |
|---|---|
| |
| |
| No idempotency for payments | Use idempotency keys |
| Ignoring return values | Handle all outcomes explicitly |
references/worker-patterns.mdreferences/queue-config.mdreferences/testing-patterns.md