Technical Documentation: taskforcesh/bullmq
βΉοΈ Provenance: Multi-Tier Ingestion Β· CodeWiki Reference
Overview (`README.md`)
π Tutorials
You can find tutorials and news in this blog: https://blog.taskforce.sh/
News π
π Language agnostic BullMQ
BullMQ is available natively in multiple languages:
- Node.js / Bun β This repository (
npm install bullmq) - Python β
python/directory (pip install bullmq) - Rust β
rust/directory (cargo add bullmq-official --rename bullmq) - Elixir β
elixir/directory ({:bullmq, "~> x.x"}) - .Net β
dotnet/directory (dotnet add package BullMQ) - PHP β
php/directory
For other platforms, check out the BullMQ Proxy.
Official FrontEnd
Supercharge your queues with a professional front end:
- Get a complete overview of all your queues.
- Inspect jobs, search, retry, or promote delayed jobs.
- Metrics and statistics.
- and many more features.
Sign up at Taskforce.sh
π Sponsors π
| | Dragonfly is a new Redisβ’ drop-in replacement that is fully compatible with BullMQ and brings some important advantages over Redisβ’ such as massive
better performance by utilizing all CPU cores available and faster and more memory efficient data structures. Read more here on how to use it with BullMQ. |
| --- | --- |
Used by
Some notable organizations using BullMQ:
The gist
Install:
$ yarn add bullmqIf you use the node-redis adapter (createNodeRedisClient), install redis v5 or newer (redis >= 5.0.0).
If you use the Valkey Glide adapter (createValkeyGlideClient), install @valkey/valkey-glide.
Add jobs to the queue:
import { Queue } from 'bullmq';
const queue = new Queue('Paint');
queue.add('cars', { color: 'blue' });Process the jobs in your workers:
import { Worker } from 'bullmq';
const worker = new Worker('Paint', async job => {
if (job.name === 'cars') {
await paintCar(job.data.color);
}
});Listen to jobs for completion:
import { QueueEvents } from 'bullmq';
const queueEvents = new QueueEvents('Paint');
queueEvents.on('completed', ({ jobId }) => {
console.log('done painting');
});
queueEvents.on(
'failed',
({ jobId, failedReason }: { jobId: string; failedReason: string }) => {
console.error('error painting', failedReason);
},
);Adds jobs with parent-child relationship:
import { FlowProducer } from 'bullmq';
const flow = new FlowProducer();
const originalTree = await flow.add({
name: 'root-job',
queueName: 'topQueueName',
data: {},
children: [
{
name: 'child-job',
data: { idx: 0, foo: 'bar' },
queueName: 'childrenQueueName',
children: [
{
name: 'grandchild-job',
data: { idx: 1, foo: 'bah' },
queueName: 'grandChildrenQueueName',
},
{
name: 'grandchild-job',
data: { idx: 2, foo: 'baz' },
queueName: 'grandChildrenQueueName',
},
],
},
{
name: 'child-job',
data: { idx: 3, foo: 'foo' },
queueName: 'childrenQueueName',
},
],
});This is just scratching the surface, check all the features and more in the official documentation
Feature Comparison
Since there are a few job queue solutions, here is a table comparing them:
| Feature | BullMQ-Pro | BullMQ | Bull | Kue | Bee | Agenda |
|---|---|---|---|---|---|---|
| Backend | redis | redis | redis | redis | redis | mongo |
| Observables | β | |||||
| Group Rate Limit | β | |||||
| Group Support | β | |||||
| Batches Support | β | |||||
| Parent/Child Dependencies | β | β | ||||
| Deduplication (Debouncing) | β | β | β | |||
| Deduplication (Throttling) | β | β | β | |||
| Priorities | β | β | β | β | β | |
| Concurrency | β | β | β | β | β | β |
| Delayed jobs | β | β | β | β | β | |
| Global events | β | β | β | β | ||
| Rate Limiter | β | β | β | |||
| Pause/Resume | β | β | β | β | ||
| Sandboxed worker | β | β | β | |||
| Repeatable jobs | β | β | β | β | ||
| Atomic ops | β | β | β | β | ||
| Persistence | β | β | β | β | β | β |
| UI | β | β | β | β | β | |
| Optimized for | Jobs / Messages | Jobs / Messages | Jobs / Messages | Jobs | Messages | Jobs |
Contributing
Fork the repo, make some changes, submit a pull-request! Here is the contributing doc that has more details.
Thanks
Thanks for all the contributors that made this library possible,
also a special mention to Leon van Kammen that kindly donated
his npm bullmq repo.
Overview (`dotnet/README.md`)
BullMQ for .NET
The official .NET port of BullMQ, the fast and robust
Redis- and PostgreSQL-based distributed queue.
This binding is glue code on top of the exact same Lua (Redis) and SQL
(PostgreSQL) scripts used by every other BullMQ runtime (Node.js, Python, PHP,
Elixir, Rust). Sharing the scripts is what guarantees identical, battle-tested
atomicity and semantics across languages: a queue produced by the Node.js
library can be consumed by a .NET worker and vice versa.
Status: the database-agnostic queue-backend contract is fully implemented
for both Redis and PostgreSQL and validated by a shared conformance suite
(the exact same tests run against both adapters). The high-levelQueue,WorkerandJobclasses run on either backend β select PostgreSQL by
settingPostgreson the options.FlowProducer,QueueEventsandJobSchedulerare also implemented.
Requirements
- .NET 8.0 or newer
- A Redis 6.2+ server (or a compatible server such as Valkey/Dragonfly), or
a PostgreSQL 13+ server when using the PostgreSQL backend
Installation
dotnet add package BullMQQuick start
using BullMQ;
// Create a queue and add a job.
await using var queue = new Queue("emails", new QueueOptions
{
Connection = ConnectionOptions.FromString("localhost:6379"),
});
await queue.AddAsync("welcome", new { to = "[email protected]" });
// Process jobs with a worker.
await using var worker = new Worker("emails", async (job, ct) =>
{
Console.WriteLine($"Processing {job.Name} #{job.Id}");
// ... do the work ...
return "sent";
}, new WorkerOptions
{
Connection = ConnectionOptions.FromString("localhost:6379"),
Concurrency = 5,
});
worker.Completed += (job, result) =>
Console.WriteLine($"Job {job.Id} completed with '{result}'");Sharing a connection
Pass an existing IConnectionMultiplexer to reuse a connection across queues and
workers (BullMQ will not dispose a connection it does not own):
var mux = await StackExchange.Redis.ConnectionMultiplexer.ConnectAsync("localhost:6379");
var options = new QueueOptions
{
Connection = new ConnectionOptions { Multiplexer = mux },
};Using PostgreSQL
Set Postgres on the options to run the exact same Queue/Worker/Job API
against PostgreSQL instead of Redis. The schema (default bullmq) namespaces all
queues and the required tables/functions are migrated automatically on first use.
using BullMQ;
using BullMQ.Postgres;
var pg = new PostgresOptions
{
ConnectionString = "Host=localhost;Database=bullmq;Username=postgres;Password=postgres",
// Schema = "bullmq", // optional, this is the default
};
await using var queue = new Queue("emails", new QueueOptions { Postgres = pg });
await queue.AddAsync("welcome", new { to = "[email protected]" });
await using var worker = new Worker("emails", async (job, ct) => "sent",
new WorkerOptions { Postgres = pg, Concurrency = 5 });Development
The shared Lua scripts live at the repository root under rawScripts/ and are
copied into dotnet/src/BullMQ/Commands/ (embedded into the assembly) and, for
the PostgreSQL backend, src/postgres/** is copied intodotnet/src/BullMQ/Postgres/. These copies are generated and git-ignored.
From the repository root:
# Populate the generated script copies (requires `yarn install` once).
yarn copy:lua:dotnet
yarn copy:sql:dotnet
# Build and test.
cd dotnet
dotnet build
dotnet test # requires a Redis server on localhost:6379Or just run the helper, which copies the shared scripts if needed, sets the
default test connections, and runs the suite (any arguments are passed straight
through to dotnet test):
cd dotnet
./scripts/test.sh # whole suite (Redis + PostgreSQL)
./scripts/test.sh --filter Name~Flow # a subsetSet BULLMQ_TEST_REDIS and/or BULLMQ_TEST_POSTGRES to point the integration
tests at different servers.
License
MIT β see LICENSE.
Overview (`elixir/README.md`)
BullMQ for Elixir
A powerful, fast, and robust job queue for Elixir with pluggable backends (Redis and PostgreSQL). This is an Elixir port of the popular BullMQ library for Node.js, providing full compatibility with existing BullMQ queues.
Features
- β‘ High Performance - Optimized backends for Redis and PostgreSQL
- π Automatic Retries - Configurable retry strategies with exponential backoff
- β° Job Scheduling - Delay jobs or schedule them with cron expressions
- π Priority Queues - Process important jobs first
- π¦ Rate Limiting - Control processing rates
- π¨βπ©βπ§βπ¦ Parent-Child Jobs - Create complex workflows with dependencies
- π‘ Real-time Events - Subscribe to job lifecycle events via Worker callbacks or QueueEvents
- π Reliable - Stalled job detection and recovery
- π Observable - Built-in Telemetry integration
- ποΈ OTP Native - Built with GenServers and Supervisors
- π Node.js Compatible - Jobs can be shared between Elixir and Node.js workers
Installation
Add bullmq to your list of dependencies in mix.exs:
def deps do
[
{:bullmq, "~> 1.0"}
]
endIf you want to use the PostgreSQL backend, add :postgrex in your application too:
def deps do
[
{:bullmq, "~> 1.0"},
{:postgrex, "~> 0.22"}
]
endBackend Refactoring: Pluggable Backends
BullMQ Elixir now routes queue operations through a backend behaviour (BullMQ.Backend).
The high-level modules (Queue, Worker, Job, QueueEvents, FlowProducer, JobScheduler) are backend-agnostic.
You can select a backend:
- per call/process with
backend: ... - globally with
config :bullmq, :backend, ...
# config/config.exs
config :bullmq, :backend, BullMQ.Backends.Redis# per-call override
BullMQ.Queue.add("emails", "send", %{to: "[email protected]"},
connection: :my_pg,
backend: BullMQ.Backends.Postgres
)PostgreSQL (SQL) Backend
The PostgreSQL backend (BullMQ.Backends.Postgres) uses the same shared SQL artifacts
as the Node.js implementation:
src/postgres/migrations/*.sqlsrc/postgres/commands/*.sql
This keeps behavior aligned across runtimes while avoiding SQL forks.
In Hex packages and Mix releases, BullMQ reads these SQL files fromelixir/priv/postgres; when running from this repository during development, it
falls back to src/postgres. Migrations are applied automatically byBullMQ.Backends.Postgres.Connection.start_link/1.
PostgreSQL setup
{:ok, _conn} =
BullMQ.Backends.Postgres.Connection.start_link(
name: :my_pg,
url: "postgresql://localhost:5432/bullmq",
schema: "bullmq"
)Then use the backend explicitly:
{:ok, job} =
BullMQ.Queue.add("emails", "send-welcome", %{to: "[email protected]"},
connection: :my_pg,
backend: BullMQ.Backends.Postgres
)
{:ok, worker} =
BullMQ.Worker.start_link(
queue: "emails",
connection: :my_pg,
backend: BullMQ.Backends.Postgres,
processor: &MyApp.EmailWorker.process/1
)Quick Start
1. Add Jobs to a Queue
# Add a job using stateless API (recommended for most use cases)
{:ok, job} = BullMQ.Queue.add("emails", "send-welcome", %{
to: "[email protected]",
template: "welcome"
}, connection: :my_redis)
# Add a delayed job
{:ok, job} = BullMQ.Queue.add("emails", "reminder", %{message: "Don't forget!"},
connection: :my_redis,
delay: 60_000 # 1 minute
)
# Add a prioritized job
{:ok, job} = BullMQ.Queue.add("emails", "urgent", %{},
connection: :my_redis,
priority: 1 # Lower = higher priority
)2. Process Jobs with a Worker
defmodule MyApp.EmailWorker do
def process(%BullMQ.Job{name: "send-welcome", data: data}) do
MyApp.Mailer.send_welcome(data["to"], data["template"])
{:ok, %{sent: true}}
end
def process(%BullMQ.Job{name: name}) do
{:error, "Unknown job type: #{name}"}
end
end
# Start a worker with event callbacks
{:ok, worker} = BullMQ.Worker.start_link(
queue: "emails",
connection: :my_redis,
processor: &MyApp.EmailWorker.process/1,
concurrency: 5,
on_completed: fn job, result ->
IO.puts("Job #{job.id} completed with #{inspect(result)}")
end,
on_failed: fn job, reason ->
IO.puts("Job #{job.id} failed: #{reason}")
end
)3. Add to Your Supervision Tree
defmodule MyApp.Application do
use Application
def start(_type, _args) do
children = [
# Start Redis connection
{Redix, name: :my_redis, host: "localhost", port: 6379},
# Start email worker
{BullMQ.Worker,
queue: "emails",
connection: :my_redis,
processor: &MyApp.EmailWorker.process/1,
concurrency: 5
}
]
Supervisor.start_link(children, strategy: :one_for_one)
end
endAdvanced Features
Job Options
BullMQ.Queue.add("tasks", "process-data", %{data: "..."},
connection: :my_redis,
priority: 1, # Lower = higher priority
delay: 60_000, # Delay 60 seconds
attempts: 5, # Retry up to 5 times
backoff: %{
type: "exponential",
delay: 1000
},
remove_on_complete: true, # Clean up after completion
remove_on_fail: 100 # Keep last 100 failed jobs
)Worker Event Callbacks
Workers support event callbacks similar to Node.js:
{:ok, worker} = BullMQ.Worker.start_link(
queue: "tasks",
connection: :my_redis,
processor: &process/1,
on_completed: fn job, result -> handle_completion(job, result) end,
on_failed: fn job, reason -> handle_failure(job, reason) end,
on_active: fn job -> handle_active(job) end,
on_stalled: fn job_id -> handle_stalled(job_id) end
)Queue Events (Real-time Subscriptions)
Subscribe to queue-level events using Redis Streams:
{:ok, events} = BullMQ.QueueEvents.start_link(
queue: "tasks",
connection: :my_redis
)
BullMQ.QueueEvents.subscribe(events)
receive do
{:bullmq_event, :completed, %{"jobId" => id}} ->
IO.puts("Job #{id} completed!")
{:bullmq_event, :failed, %{"jobId" => id, "failedReason" => reason}} ->
IO.puts("Job #{id} failed: #{reason}")
endRate Limiting
{:ok, worker} = BullMQ.Worker.start_link(
queue: "api-calls",
connection: :my_redis,
processor: &process/1,
limiter: %{max: 100, duration: 60_000} # 100 per minute
)Job Schedulers (Repeatable Jobs)
# Create a scheduler with cron pattern
{:ok, job} = BullMQ.JobScheduler.upsert(:my_redis, "maintenance", "cleanup",
%{pattern: "0 * * * *"}, # Every hour
"cleanup-job",
%{type: "hourly"},
prefix: "bull"
)
# Create an interval-based scheduler
{:ok, job} = BullMQ.JobScheduler.upsert(:my_redis, "heartbeats", "ping",
%{every: 60_000}, # Every minute
"heartbeat",
%{},
prefix: "bull"
)
# List schedulers
{:ok, schedulers} = BullMQ.JobScheduler.list(:my_redis, "maintenance", prefix: "bull")
# Remove a scheduler
{:ok, removed} = BullMQ.JobScheduler.remove(:my_redis, "maintenance", "cleanup", prefix: "bull")Job Progress
def process(%BullMQ.Job{} = job) do
Enum.each(1..100, fn i ->
do_work(i)
BullMQ.Worker.update_progress(job, i)
end)
{:ok, "done"}
endQueue Getters
# Get job counts
{:ok, counts} = BullMQ.Queue.get_counts("emails", connection: :my_redis)
# => %{waiting: 10, active: 2, delayed: 5, completed: 100, failed: 3, ...}
# Get jobs in a specific state
{:ok, jobs} = BullMQ.Queue.get_jobs("emails", [:waiting, :delayed],
connection: :my_redis, start: 0, end: 9)
# Get a specific job
{:ok, job} = BullMQ.Queue.get_job("emails", "job-id-123", connection: :my_redis)
# Get job state
{:ok, state} = BullMQ.Queue.get_job_state("emails", "job-id-123", connection: :my_redis)
# => :waiting | :active | :delayed | :completed | :failedQueue Operations
# Pause the queue
:ok = BullMQ.Queue.pause("emails", connection: :my_redis)
# Resume the queue
:ok = BullMQ.Queue.resume("emails", connection: :my_redis)
# Check if paused
{:ok, is_paused} = BullMQ.Queue.paused?("emails", connection: :my_redis)
# Drain the queue (remove all waiting jobs)
:ok = BullMQ.Queue.drain("emails", connection: :my_redis)
# Remove a specific job
:ok = BullMQ.Queue.remove_job("emails", "job-id-123", connection: :my_redis)
# Retry a failed job
:ok = BullMQ.Queue.retry_job("emails", "job-id-123", connection: :my_redis)Graceful Shutdown
Workers automatically wait for active jobs to complete when closing:
# Close worker and wait for active jobs to finish
:ok = BullMQ.Worker.close(worker)
# Force close without waiting
:ok = BullMQ.Worker.close(worker, force: true)Documentation
Full documentation is available at HexDocs.
Requirements
- Elixir 1.15+
- Erlang/OTP 26+
- Redis 6.0+ (Redis backend)
- PostgreSQL 13+ (PostgreSQL backend)
Compatibility
This library is fully compatible with the Node.js BullMQ library. Jobs can be added from Node.js and processed by Elixir workers, and vice versa. Redis users share the same data structures and Lua scripts; PostgreSQL users share the same SQL migrations and commands.
License
MIT License - see LICENSE for details.
Contributing
Contributions are welcome! Please see our Contributing Guide.
Commit Convention
This project uses Conventional Commits with automated releases via semantic-release. For Elixir-specific changes, add [elixir] tag to your commit message:
# Bug fix (patch release: 0.0.x)
git commit -m "fix(worker): handle job timeout correctly [elixir]"
# New feature (minor release: 0.x.0)
git commit -m "feat(queue): add bulk job operations [elixir]"
# Breaking change (major release: x.0.0)
git commit -m "feat(worker)!: change processor callback signature [elixir]"| Commit Type | Version Bump | Example |
|---|---|---|
fix(...): ... [elixir] |
Patch | fix(scripts): correct ARGV order [elixir] |
feat(...): ... [elixir] |
Minor | feat(queue): add getJobCounts [elixir] |
feat(...)!: ... [elixir] |
Major | feat(worker)!: new API [elixir] |
docs(...): ... [elixir] |
None | docs(readme): update examples [elixir] |
chore(...): ... [elixir] |
None | chore(deps): update redix [elixir] |
Credits
This is an Elixir port of BullMQ by Taskforce.sh.
Overview (`php/README.md`)
BullMQ PHP
A PHP client library for BullMQ, the modern queue system for Node.js.
This library allows you to add jobs to a BullMQ queue from your PHP application. The jobs can then be processed by workers written in Node.js, Python, or Elixir.
Requirements
- PHP 8.1 or higher
- Redis 5.0 or higher (6.2+ recommended)
- Composer
Installation
Option 1: Download Release (Recommended)
Download the latest release from the releases page (look for bullmq-php-X.X.X.zip), extract it to your project, and configure Composer:
{
"repositories": [
{
"type": "path",
"url": "./bullmq-php-X.X.X"
}
],
"require": {
"taskforcesh/bullmq-php": "*"
}
}Then run:
composer installOption 2: Install from GitHub (Development)
For development or if you want the latest changes, you can install directly from the repository. Note that this requires Node.js to build the Lua scripts first.
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/taskforcesh/bullmq"
}
],
"require": {
"taskforcesh/bullmq-php": "dev-master"
},
"minimum-stability": "dev",
"prefer-stable": true
}After installing, you need to build the Lua scripts:
cd vendor/taskforcesh/bullmq-php
# From the monorepo root:
yarn install
yarn build
yarn copy:lua:phpNote: Stable releases are tagged with the format
vphp{version}(e.g.,vphp1.0.0). Check the releases page for available versions.
Quick Start
Creating a Queue
use BullMQ\Queue;
// Create a queue with default connection (localhost:6379)
$queue = new Queue('my-queue');
// Or with custom Redis connection
$queue = new Queue('my-queue', [
'connection' => [
'host' => 'redis.example.com',
'port' => 6379,
'password' => 'your-password',
],
]);Adding Jobs
use BullMQ\Queue;
$queue = new Queue('email-queue');
// Add a simple job
$job = $queue->add('send-email', [
'to' => '[email protected]',
'subject' => 'Welcome!',
'body' => 'Thanks for signing up.',
]);
echo "Job added with ID: " . $job->id . "\n";Job Options
// Delayed job (delay in milliseconds)
$job = $queue->add('reminder', $data, [
'delay' => 60000, // Process after 60 seconds
]);
// Priority job (lower number = higher priority)
$job = $queue->add('urgent', $data, [
'priority' => 1,
]);
// Custom job ID
$job = $queue->add('process-order', $data, [
'jobId' => 'order-' . $orderId,
]);
// Job with retry settings
$job = $queue->add('flaky-operation', $data, [
'attempts' => 3,
'backoff' => [
'type' => 'exponential',
'delay' => 1000,
],
]);
// Job with removal policy
$job = $queue->add('task', $data, [
'removeOnComplete' => true,
'removeOnFail' => 100, // Keep last 100 failed jobs
]);
// LIFO (Last In, First Out) - process newest jobs first
$job = $queue->add('task', $data, [
'lifo' => true,
]);
// Custom timestamp (defaults to current time)
$job = $queue->add('task', $data, [
'timestamp' => (int)(microtime(true) * 1000),
]);Adding Multiple Jobs
$jobs = $queue->addBulk([
['name' => 'email', 'data' => ['to' => '[email protected]']],
['name' => 'email', 'data' => ['to' => '[email protected]']],
['name' => 'email', 'data' => ['to' => '[email protected]']],
]);Getting Job Information
// Get a specific job
$job = $queue->getJob('job-id');
if ($job) {
echo "Job name: " . $job->name . "\n";
echo "Job data: " . json_encode($job->data) . "\n";
echo "Job state: " . $queue->getJobState($job->id) . "\n";
}
// Get jobs by state
$waitingJobs = $queue->getWaiting(0, 10);
$activeJobs = $queue->getActive(0, 10);
$delayedJobs = $queue->getDelayed(0, 10);
$completedJobs = $queue->getCompleted(0, 10);
$failedJobs = $queue->getFailed(0, 10);
// Get job counts
$counts = $queue->getJobCounts();
echo "Waiting: " . $counts['waiting'] . "\n";
echo "Active: " . $counts['active'] . "\n";
echo "Delayed: " . $counts['delayed'] . "\n";
echo "Completed: " . $counts['completed'] . "\n";
echo "Failed: " . $counts['failed'] . "\n";
// Get count for specific types
$pending = $queue->getJobCountByTypes('waiting', 'delayed');
echo "Pending jobs: " . $pending . "\n";
// Get counts grouped by priority
$priorityCounts = $queue->getCountsPerPriority([0, 1, 2, 3]);
echo "Priority 0: " . $priorityCounts[0] . "\n";
echo "Priority 1: " . $priorityCounts[1] . "\n";Queue Management
// Pause the queue
$queue->pause();
echo "Queue paused: " . ($queue->isPaused() ? 'yes' : 'no') . "\n";
// Resume the queue
$queue->resume();
// Remove a specific job
$removed = $queue->remove('job-id');
// Clean old jobs (grace period in milliseconds)
$cleaned = $queue->clean(
grace: 3600000, // 1 hour
limit: 100,
type: 'completed'
);
// Retry failed jobs with options
$queue->retryJobs([
'count' => 100, // Max jobs to retry per iteration
'state' => 'failed', // State to retry from: 'failed' or 'completed'
'timestamp' => time() * 1000, // Only retry jobs before this timestamp
]);
// Promote delayed jobs (move to waiting)
$queue->promoteJobs(['count' => 100]);
// Drain the queue (remove all waiting jobs)
$queue->drain();
// Obliterate the queue (remove everything)
$queue->obliterate(['force' => true]);Parent-Child Jobs (Flows)
// Add a child job with a parent
$childJob = $queue->add('child-task', $childData, [
'parent' => [
'id' => 'parent-job-id',
'queue' => 'bull:parent-queue',
],
]);Job States
Jobs can be in one of the following states:
waiting- Job is waiting to be processedactive- Job is currently being processeddelayed- Job is delayed and waiting for its delay to expirecompleted- Job has been successfully processedfailed- Job has failed after all retry attemptspaused- Job is in a paused queueprioritized- Job is in the prioritized setwaiting-children- Parent job waiting for child jobs to complete
Connection Options
// Using a connection array
$queue = new Queue('my-queue', [
'connection' => [
'host' => 'localhost',
'port' => 6379,
'database' => 0,
'password' => null,
'username' => null,
],
]);
// Using a Redis URI
$queue = new Queue('my-queue', [
'connection' => 'redis://user:password@localhost:6379/0',
]);
// Sharing a connection
use BullMQ\RedisConnection;
$connection = new RedisConnection([
'host' => 'localhost',
'port' => 6379,
]);
$queue1 = new Queue('queue-1', ['connection' => $connection]);
$queue2 = new Queue('queue-2', ['connection' => $connection]);
// Custom prefix
$queue = new Queue('my-queue', [
'prefix' => 'myapp',
]);Interoperability
Jobs added with this PHP library can be processed by BullMQ workers in:
- Node.js - Using the official BullMQ package
- Python - Using the BullMQ Python package
- Elixir - Using the BullMQ Elixir package
Example Node.js worker:
import { Worker } from 'bullmq';
const worker = new Worker('my-queue', async job => {
console.log(`Processing job ${job.id} with data:`, job.data);
// Process the job...
return { success: true };
});Error Handling
use BullMQ\Queue;
try {
$queue = new Queue('my-queue');
$job = $queue->add('task', $data);
} catch (\RuntimeException $e) {
echo "Error: " . $e->getMessage() . "\n";
}Testing
composer testLicense
MIT License - see LICENSE for details.
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
API Reference
Queue Methods
| Method | Description |
|---|---|
add(name, data, opts) |
Add a single job to the queue |
addBulk(jobs) |
Add multiple jobs in a single operation |
getJob(id) |
Get a job by its ID |
getJobs(jobIds) |
Get multiple jobs by their IDs |
getJobsByType(types, start, end, asc) |
Get jobs by type(s) with pagination |
getJobState(id) |
Get the current state of a job |
getJobCounts() |
Get job counts for all states |
getJobCountByTypes(...types) |
Get total count for specific types |
getCountsPerPriority(priorities) |
Get counts grouped by priority |
getWaiting(start, end) |
Get waiting jobs |
getActive(start, end) |
Get active jobs |
getDelayed(start, end) |
Get delayed jobs |
getPrioritized(start, end) |
Get prioritized jobs |
getCompleted(start, end) |
Get completed jobs |
getFailed(start, end) |
Get failed jobs |
pause() |
Pause the queue |
resume() |
Resume the queue |
isPaused() |
Check if queue is paused |
remove(jobId) |
Remove a specific job |
clean(grace, limit, type) |
Clean old jobs |
drain(delayed) |
Remove all waiting/delayed jobs |
obliterate(opts) |
Remove all queue data |
retryJobs(opts) |
Retry failed/completed jobs |
promoteJobs(opts) |
Promote delayed jobs to waiting |
close() |
Close the connection |
Job Options
| Option | Type | Description |
|---|---|---|
jobId |
string | Custom job ID |
delay |
int | Delay in milliseconds before processing |
priority |
int | Priority (lower = higher priority) |
attempts |
int | Number of retry attempts |
backoff |
array/int | Backoff strategy for retries |
lifo |
bool | Process newest jobs first |
removeOnComplete |
bool/int/array | Remove job on completion |
removeOnFail |
bool/int/array | Remove job on failure |
timestamp |
int | Job creation timestamp (ms) |
parent |
array | Parent job reference for flows |
Note on Job Schedulers: Repeatable/scheduled jobs (cron patterns) should be created from the Node.js side using
JobScheduler. The PHP client is designed for adding individual jobs, not managing schedulers.
Links
Overview (`python/README.md`)
BullMQ For Python
This is the official BullMQ Python library. It is a close port of the NodeJS version of the library.
Python Queues are interoperable with NodeJS Queues, as both libraries use the same .lua scripts that
power all the functionality.
Features
Currently, the library does not support all the features available in the NodeJS version. The following
have been ported so far:
Add jobs to queues.
- Regular jobs.
- Delayed jobs.
- Job deduplication.
- Job priority.
- Repeatable (via
JobScheduler).
Workers
Job events (via
QueueEventsandQueueEventsProducer).Job progress.
Job retries.
Job backoff.
Getters.
Lock Manager (batched lock renewal).
Per-job cancellation (cooperative
AbortController).
Installation
pip install bullmqUsage
Basic Example
from bullmq import Queue
queue = Queue('my-queue')
job = await queue.add('my-job', {'foo': 'bar'})Job Priority
Prioritize jobs so higher priority jobs are processed first. Lower number = higher
priority. 1 is the highest priority and 2_097_152 is the lowest. A priority of0 (the default) means "no priority" and jobs are processed in FIFO order.
from bullmq import Queue
queue = Queue('my-queue')
# Higher priority job (will be processed first)
await queue.add('paint', {'color': 'red'}, {'priority': 1})
# Lower priority job
await queue.add('paint', {'color': 'blue'}, {'priority': 10})Job Deduplication
Prevent duplicate jobs from being added to the queue:
from bullmq import Queue
queue = Queue('my-queue')
# Simple mode - deduplicates until job completes or fails
job = await queue.add('paint', {'color': 'white'}, {
'deduplication': {
'id': 'custom-dedup-id'
}
})
# Throttle mode - deduplicates for a specific time window (in milliseconds)
job = await queue.add('paint', {'color': 'white'}, {
'deduplication': {
'id': 'custom-dedup-id',
'ttl': 5000 # 5 seconds
}
})
# Debounce mode - replaces pending job with latest data
job = await queue.add('paint', {'color': 'white'}, {
'deduplication': {
'id': 'custom-dedup-id',
'ttl': 5000,
'extend': True, # Extend TTL on each duplicate attempt
'replace': True # Replace job data with latest
},
'delay': 5000 # Must be delayed for replace to work
})Documentation
The documentation is available at https://docs.bullmq.io
License
MIT
Copyright
Copyright (c) 2018-2023, Taskforce.sh Inc. and other contributors.
Overview (`rust/README.md`)
BullMQ Rust
A high-performance Rust port of BullMQ β a robust job queue backed by Redis.
Fully compatible with Node.js and Elixir BullMQ queues (same Lua scripts and Redis data structures).
Features
- Queue β Add jobs with delay, priority, deduplication, custom IDs, and a
per-jobsize_limit; rich getters (get_jobs,get_waiting,count,get_counts_per_priority,get_meta,get_version,is_maxed,get_workers/get_workers_count, β¦), global concurrency/rate-limit,
time-series metrics (get_metrics) and Prometheus export
(export_prometheus_metrics). - Worker β Process jobs with configurable concurrency, stalled job detection,
lock renewal, rate limiting, cancellation, optional metrics collection, and
behavioural flags (max_started_attempts,skip_stalled_check,skip_lock_renewal). - QueueEvents β Cross-process, Redis-stream-based event listener observing
completed/failed/progress/added/delayed/drained/β¦ events from any
process connected to the same Redis. - Job β First-class job lifecycle: progress tracking, retries, backoff,
logs (log/clear_logs),discard, and parent/child relationships. - FlowProducer β Atomically add trees of dependent jobs, with
get_flowand
per-queue default options. - JobScheduler β Cron/interval repeatable jobs (managed via the
QueueAPI). - Connections β URL or typed options (host/port/username/password/db) with
TLS (rediss://) support, and Redis Cluster (use a hash-tagged prefix such
as{bull}). - FFI-ready β Clean trait-based API designed for straightforward bindings to
Go, C#, Python, etc. - Zero-copy Lua scripts β Scripts are embedded at compile time via
include_str!.
See FEATURE_PARITY.md for a detailed comparison with the
Node.js implementation. Remaining gaps are intentionally scoped: legacy
maintenance methods (remove_orphaned_jobs, legacy repeatable API),Job.wait_until_finished, Redis Sentinel, and telemetry.
Quick Start
use bullmq::{Queue, Worker, Job, QueueOptions, WorkerOptions};
use bullmq::worker::{ProcessorFn, CancellationToken};
use std::sync::Arc;
#[tokio::main]
async fn main() -> bullmq::Result<()> {
// Create a queue
let queue = Queue::new("my-queue", QueueOptions::default()).await?;
// Add a job
queue.add("send-email", serde_json::json!({
"to": "[email protected]",
"subject": "Hello!"
}), None).await?;
// Create a worker
let processor: ProcessorFn = Arc::new(|job: Job, _token: CancellationToken| {
Box::pin(async move {
println!("Processing job: {} - {}", job.id(), job.name());
Ok(serde_json::json!({"sent": true}))
})
});
let worker = Worker::new("my-queue", processor, WorkerOptions::default()).await?;
// Worker processes jobs automatically...
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
worker.close(5000).await?;
Ok(())
}Listening to events (QueueEvents)
QueueEvents consumes the queue's Redis event stream, so you can observe job
lifecycle events from any process connected to the same Redis server:
use bullmq::{QueueEvents, QueueEventsOptions, QueueEvent};
#[tokio::main]
async fn main() -> bullmq::Result<()> {
let events = QueueEvents::new("my-queue", QueueEventsOptions::default()).await?;
while let Some(entry) = events.next_event().await {
match entry.event {
QueueEvent::Completed { job_id, return_value, .. } => {
println!("job {job_id} completed: {return_value}");
}
QueueEvent::Failed { job_id, failed_reason, .. } => {
println!("job {job_id} failed: {failed_reason}");
}
QueueEvent::Progress { job_id, data } => {
println!("job {job_id} progress: {data}");
}
_ => {}
}
}
events.close().await;
Ok(())
}Requirements
- Rust 1.85+
- Redis 6.2+
- Tokio runtime
Running Tests
# Ensure Redis is running on localhost:6379
yarn generate:raw:scripts
yarn copy:lua:rust
cargo test
# Or specify a custom Redis URL
REDIS_URL=redis://myhost:6379 cargo testArchitecture
src/
βββ lib.rs # Public API re-exports
βββ error.rs # Error types and BullMQ protocol codes
βββ types.rs # Shared types (JobState, JobProgress, Metrics, etc.)
βββ keys.rs # Redis key generation
βββ options.rs # Configuration options (Queue/Worker/Job/Connection)
βββ redis_connection.rs # Redis connection management (URL or typed options, TLS, Cluster)
βββ scripts.rs # Lua script registry (compile-time embedded)
βββ job.rs # Job struct and Redis serialization
βββ queue.rs # Queue operations, getters, metrics, schedulers
βββ flow_producer.rs # Parent/child job trees (flows)
βββ job_scheduler.rs # Cron/interval scheduling helpers
βββ worker.rs # Worker processing loop
src/commands/ # Generated Lua scripts embedded with include_str!
tests/ # Integration test suites (queue, worker, job, flow,
# metrics, connection, rate limit, schedulers, β¦)Design Principles
- Idiomatic Rust β Uses
async/await,Arcfor sharing,tokiofor concurrency,thiserrorfor errors. - FFI-friendly β All public types are
Send + Sync. TheProcessorFnis a simple trait object that can be wrapped for C FFI. - Compatible β Uses the exact same Lua scripts as Node.js BullMQ, ensuring full wire compatibility.
- Fast β Zero-copy script embedding, multiplexed Redis connections, lock-free atomics where possible.
License
MIT
Overview (`docs/gitbook/README.md`)
What is BullMQ
BullMQ is a Node.js library that implements a fast and robust queue system built on top of Redis that helps in resolving many modern age micro-services architectures.
The library is designed so that it will fulfill the following goals:
- Exactly once queue semantics, i.e., attempts to deliver every message exactly one time, but it will deliver at least once in the worst case scenario*.
- Easy to scale horizontally. Add more workers for processing jobs in parallel.
- Consistent.
- High performant. Try to get the highest possible throughput from Redis by combining efficient .lua scripts and pipelining.
View the repository, see open issues, and contribute back on GitHub!
**Features**
If you are new to Message Queues, you may wonder why they are needed after all. Queues can solve many different problems in an elegant way, from smoothing out processing peaks to creating robust communication channels between micro-services or offloading heavy work from one server to many smaller workers, and many other use cases. Check the Patterns section for getting some inspiration and information about best practices.
- Minimal CPU usage due to a polling-free design
- Distributed job execution based on Redis
- LIFO and FIFO jobs
- Priorities
- Delayed jobs
- Scheduled and repeatable jobs according to cron specifications
- Retries of failed jobs
- Concurrency setting per worker
- Threaded (sandboxed) processing functions
- Automatic recovery from process crashes
- Parent-Child dependencies
Used by
BullMQ is used by many organizations big and small, here are some notable examples:
.png>)
Overview (`docs/gitbook/bull/patterns/README.md`)
Patterns
Here are a few examples of useful patterns that are often implemented with Bull:
- Persistent connections
- Message Queue
- Returning Job Completions
- Reusing Redis Connections
- Redis Cluster
- Debugging
- Custom backoff strategy
- Manually fetching jobs
If you have any other common patterns you want to add, pull request them!
Overview (`docs/gitbook/bullmq-pro/groups/README.md`)
Groups
Groups allows you to use a single queue while distributing the jobs among groups so that the jobs are processed one by one relative to the group they belong to.
For example, imagine that you have 1 queue for processing video transcoding for all your users, you may have thousands of users in your application. You need to offload the transcoding operation since it is lengthy and CPU consuming. If you have many users that want to transcode many files, then in a non-grouped queue one user could fill the queue with jobs and the rest of the users will need to wait for that user to complete all its jobs before their jobs get processed.
Groups resolves this problem since jobs will be processed in a "round-robin" fashion among all the users.
(1) (1).png>)
If you have several workers or a concurrency factor larger than one, jobs will be processed in parallel, but they will be picked up from the groups as mentioned before following a round-robin ordering.
Of course you can have as many workers as you want and also scale up/down the amount of workers depending on how many jobs you have waiting in the queue.
If you only use grouped jobs in a queue, the waiting jobs list will not grow, instead it will just keep the next job to be processed if any. But you can add non-grouped jobs to the same queue, and they will get precedence from the jobs waiting in their respective groups.
{% hint style="info" %}
There is no hard limit on the amount of groups that you can have, nor do they have any impact on performance. When a group is empty, the group itself does not consume any resources in Redis.
{% endhint %}
Another way to see groups is like "virtual" queues. So instead of having one queue per "user", you have a "virtual" queue per user so that all users get their jobs processed in a more predictable way.
In order to use the group functionality, use the group property in the job options when adding a job:
import { QueuePro } from '@taskforcesh/bullmq-pro';
const queue = new QueuePro();
const job1 = await queue.add(
'test',
{ foo: 'bar1' },
{
group: {
id: 1,
},
},
);
const job2 = await queue.add(
'test',
{ foo: 'bar2' },
{
group: {
id: 2,
},
},
);In order to process the jobs, use a pro worker as you normally do with standard workers:
import { WorkerPro } from '@taskforcesh/bullmq-pro';
const worker = new WorkerPro('test', async job => {
// Do something useful.
// You can also do something different depending on the group
await doSomethingSpecialForMyGroup(job.opts.group);
});Using groups with batches
When combining groups with batches, you can enable groupAffinity to ensure that every batch contains jobs from a single group (or only non-group jobs). Groups are still served in round-robin order across batches. See Group Affinity for details and configuration examples.
Overview (`docs/gitbook/bullmq-pro/nestjs/README.md`)
There is a compatible module to be used in NestJs based on @nestjs/bullmq.
yarn add @taskforcesh/nestjs-bullmq-pro{% hint style="info" %}
BullMQ-Pro needs a token, as explained in the install section.
{% endhint %}
Once the installation process is complete, we can import the BullModule into the root AppModule.
import { Module } from '@nestjs/common';
import { BullModule } from '@taskforcesh/nestjs-bullmq-pro';
@Module({
imports: [
BullModule.forRoot({
connection: {
host: 'localhost',
port: 6379,
},
}),
],
})
export class AppModule {}To register a queue, import the BullModule.registerQueue() dynamic module, as follows:
BullModule.registerQueue({
name: 'queueName',
});To register a flow producer, import the BullModule.registerFlowProducer() dynamic module, as follows:
BullModule.registerFlowProducer({
name: 'flowProducerName',
});Processor
To register a processor, you may need to use Processor decorator:
import {
Processor,
WorkerHost,
OnWorkerEvent,
} from '@taskforcesh/nestjs-bullmq-pro';
import { JobPro } from 'taskforcesh/bullmq-pro';
@Processor('queueName')
class TestProcessor extends WorkerHost {
async process(job: JobPro<any, any, string>): Promise<any> {
// do some stuff
}
@OnWorkerEvent('completed')
onCompleted() {
// do some stuff
}
}And then register it as a provider:
@Module({
imports: [
BullModule.registerQueue({
name: 'queueName',
connection: {
host: '0.0.0.0',
port: 6380,
},
}),
BullModule.registerFlowProducer({
name: 'flowProducerName',
connection: {
host: '0.0.0.0',
port: 6380,
},
}),
],
providers: [TestProcessor],
})
export class AppModule {}Example
A working example is available here.
Read more:
- π‘ Queues Technique
- π‘ Register Queue API Reference
- π‘ Register Flow Producer API Reference
- π‘ Worker Listener API Reference
Overview (`docs/gitbook/bullmq-pro/observables/README.md`)
Observables
Instead of returning regular promises, your workers can also return an Observable, this allows for some more advanced uses cases:
- It makes it possible to cleanly cancel a running job.
- You can define a "Time to live" (TTL) so that jobs that take too long will be automatically canceled.
- Since the last value returned by the observable is persisted, you could retry a job and continue where you left off, for example, if the job implements a state machine or similar.
If you are new to Observables you may want to read this introduction. The two biggest advantages that Observables have over Promises are that they can emit more than 1 value and that they are cancelable.
Let's see a silly example of a worker making use of Observables:
import { WorkerPro } from "@taskforcesh/bullmq-pro"
import {Β Observable } from "rxjs"
const processor = async () => {
return new Observable<number>(subscriber => {
subscriber.next(1);
subscriber.next(2);
subscriber.next(3);
const intervalId = setTimeout(() => {
subscriber.next(4);
subscriber.complete();
}, 500);
// Provide a way of canceling and disposing the interval resource
return function unsubscribe() {
clearInterval(intervalId);
};
});
};
const worker = new WorkerPro(queueName, processor, { connection });In the example above, the observable will emit 4 values, the first 3 directly and then a 4th after 500 ms. Also note that the subscriber returns a unsubscribe function. This is the function that will be called if the Observable is cancelled, so this is where you would do the necessary clean up.
You may be asking what the use of returning several values from a worker is. One case that comes to mind is if you have a larger processor and you want to make sure that if the process crashes you can continue from the latest value. You could do this with a switch statement on the return value, something like this:
import { WorkerPro } from "@taskforcesh/bullmq-pro"
import {Β Observable } from "rxjs"
const processor = async (job) => {
return new Observable<number>(subscriber => {
switch(job.returnvalue){
default:
subscriber.next(1);
case 1:
subscriber.next(2);
case 2:
subscriber.next(3);
case 3:
subscriber.complete();
}
});
};
const worker = new WorkerPro(queueName, processor, { connection });Overview (`docs/gitbook/guide/events/README.md`)
Events
All classes in BullMQ emit useful events that inform on the lifecycles of the jobs that are running in the queue. Every class is an EventEmitter and emits different events.
Some examples:
import { Queue } from 'bullmq';
const myQueue = new Queue('Paint');
myQueue.on('waiting', (job: Job) => {
// Job is waiting to be processed.
});import { Worker } from 'bullmq';
const myWorker = new Worker('Paint');
myWorker.on('drained', () => {
// Queue is drained, no more jobs left
});
myWorker.on('completed', (job: Job) => {
// job has completed
});
myWorker.on('failed', (job: Job) => {
// job has failed
});The events above are local for the workers that actually completed the jobs. However, in many situations you want to listen to all the events emitted by all the workers in one single place. For this you can use the QueueEvents class:
import { QueueEvents } from 'bullmq';
const queueEvents = new QueueEvents('Paint');
queueEvents.on('completed', ({ jobId }) => {
// Called every time a job is completed in any worker.
});
queueEvents.on(
'progress',
({ jobId, data }: { jobId: string; data: number | object }) => {
// jobId received a progress event
},
);The QueueEvents class is implemented using Redis streams. This has some nice properties, for example, it provides guarantees that the events are delivered and not lost during disconnections such as it would be the case with standard pub-sub.
{% hint style="danger" %}
The event stream is auto-trimmed so that its size does not grow too much, by default it is ~10.000 events, but this can be configured with the streams.events.maxLen option.
{% endhint %}
Real-time updates
Local Worker / Queue listeners only see events in the current process.QueueEvents is the usual building block for real-time updates across
workers: dashboards, websockets, SSE, or another service that must react while
jobs run.
import { QueueEvents } from 'bullmq';
const queueEvents = new QueueEvents('Paint', { connection });
queueEvents.on('completed', ({ jobId, returnvalue }) => {
sendToDashboard({ type: 'completed', jobId, returnvalue });
});
queueEvents.on('failed', ({ jobId, failedReason }) => {
sendToDashboard({ type: 'failed', jobId, failedReason });
});
queueEvents.on(
'progress',
({ jobId, data }: { jobId: string; data: number | object }) => {
sendToDashboard({ type: 'progress', jobId, data });
},
);Publish progress from the worker with job.updateProgress(...) (number or
object). That pairs well with working with batches
when one job represents many items, or when you want a live bar for a long job:
await job.updateProgress({ completed: 3, total: 10 });Close QueueEvents on shutdown so its Redis connection is released:
await queueEvents.close();{% hint style="info" %}
For jobs processed with BullMQ Pro batches,
worker-local completed / failed listeners see the wrapper batch job. UseQueueEvents / QueueEventsPro when you need per-job lifecycle events.
{% endhint %}
Manual trim events
In case you need to trim your events manually, you can use trimEvents method:
{% tabs %}
{% tab title="TypeScript" %}
import { Queue } from 'bullmq';
const queue = new Queue('paint');
await queue.trimEvents(10); // leaves 10 events{% endtab %}
{% tab title="Python" %}
from bullmq import Queue
queue = Queue('paint')
await queue.trimEvents(10) # leaves 10 events{% endtab %}
{% tab title="Rust" %}
use bullmq::{Queue, QueueOptions};
let queue = Queue::new("paint", QueueOptions::default()).await?;
queue.trim_events(10).await?; // leaves 10 events{% endtab %}
{% endtabs %}
Read more:
- π‘ Queue Events API Reference
- π‘ Queue Events Listener API Reference
- π‘ Queue Listener API Reference
- π‘ Worker Listener API Reference
Overview (`docs/gitbook/guide/flows/README.md`)
Flows
BullMQ supports parent - child relationships between jobs. The basic idea is that a parent job will not be moved to the wait status (i.e. where it could be picked up by a worker) until all its children jobs have been processed successfully. Apart from that, a parent or a child job are no different from regular jobs.
This functionality enables the creation of flows where jobs are the node of trees of arbitrary depth.
{% hint style="warning" %}
Flows are added to a queue using the FlowProducer class.
{% endhint %}
In order to create "flows" you must use the FlowProducer class. The add method accepts an object with the following interface:
interface FlowJobBase<T> {
name: string;
queueName: string;
data?: any;
prefix?: string;
opts?: Omit<T, 'debounce' | 'deduplication' | 'repeat'>;
children?: FlowChildJob[];
}
type FlowChildJob = FlowJobBase<
Omit<JobsOptions, 'debounce' | 'deduplication' | 'parent' | 'repeat'>
>;
type FlowJob = FlowJobBase<JobsOptions>;So we can add a flow like this one:
{% tabs %}
{% tab title="TypeScript" %}
import { FlowProducer } from 'bullmq';
// A FlowProducer constructor takes an optional "connection"
// object otherwise it connects to a local redis instance.
const flowProducer = new FlowProducer();
const flow = await flowProducer.add({
name: 'renovate-interior',
queueName: 'renovate',
children: [
{ name: 'paint', data: { place: 'ceiling' }, queueName: 'steps' },
{ name: 'paint', data: { place: 'walls' }, queueName: 'steps' },
{ name: 'fix', data: { place: 'floor' }, queueName: 'steps' },
],
});{% endtab %}
{% tab title="Python" %}
from bullmq import FlowProducer
# A FlowProducer constructor takes an optional "connection"
# object otherwise it connects to a local redis instance.
flowProducer = FlowProducer()
flow = await flowProducer.add({
"name": "renovate-interior",
"queueName": "renovate",
"children": [
{ "name": "paint", "data": { "place": "ceiling" }, "queueName": "steps" },
{ "name": "paint", "data": { "place": "walls" }, "queueName": "steps" },
{ "name": "fix", "data": { "place": "floor" }, "queueName": "steps" },
],
}){% endtab %}
{% tab title="Rust" %}
use bullmq::{FlowProducer, FlowProducerOptions, FlowJob};
// A FlowProducer connects to a local Redis instance by default.
let flow_producer = FlowProducer::new(FlowProducerOptions::default()).await?;
let flow = flow_producer.add(FlowJob {
name: "renovate-interior".to_string(),
queue_name: "renovate".to_string(),
data: serde_json::json!({}),
opts: None,
prefix: None,
children: Some(vec![
FlowJob {
name: "paint".to_string(),
queue_name: "steps".to_string(),
data: serde_json::json!({ "place": "ceiling" }),
opts: None,
prefix: None,
children: None,
},
FlowJob {
name: "paint".to_string(),
queue_name: "steps".to_string(),
data: serde_json::json!({ "place": "walls" }),
opts: None,
prefix: None,
children: None,
},
FlowJob {
name: "fix".to_string(),
queue_name: "steps".to_string(),
data: serde_json::json!({ "place": "floor" }),
opts: None,
prefix: None,
children: None,
},
]),
}).await?;{% endtab %}
{% endtabs %}
The above code will atomically add 4 jobs: one to the "renovate" queue, and 3 to the "steps" queue. When the 3 jobs in the "steps" queue are completed, the parent job in the "renovate" queue will be processed as a regular job.
The above call will return instances for all the jobs added to the queue.
{% hint style="info" %}
Note that the parent queue does not need to be the same queue as the one used for the children.
{% endhint %}
{% hint style="warning" %}
If a jobId option is provided, make sure that it does not contain a colon : as this is considered a separator.
{% endhint %}
When the parent job is processed it is possible to access the results generated by its child jobs. For example, lets assume the following worker for the child jobs:
{% tabs %}
{% tab title="TypeScript" %}
import { Worker } from 'bullmq';
const stepsWorker = new Worker('steps', async job => {
await performStep(job.data);
if (job.name === 'paint') {
return 2500;
} else if (job.name === 'fix') {
return 1750;
}
});{% endtab %}
{% tab title="Python" %}
from bullmq import Worker
async def process(job: Job, token: str):
await performStep(job.data)
if job.name == 'paint':
return 2500
elif job.name == 'fix':
return 1750
stepsWorker = Worker("steps", process, {"connection": connection}){% endtab %}
{% tab title="Rust" %}
use bullmq::{Worker, WorkerOptions, Job};
use bullmq::worker::{CancellationToken, ProcessorFn};
use std::sync::Arc;
let processor: ProcessorFn = Arc::new(|job: Job, _token: CancellationToken| {
Box::pin(async move {
perform_step(job.data()).await;
match job.name() {
"paint" => Ok(serde_json::json!(2500)),
"fix" => Ok(serde_json::json!(1750)),
_ => Ok(serde_json::Value::Null),
}
})
});
let steps_worker = Worker::new("steps", processor, WorkerOptions::default()).await?;{% endtab %}
{% endtabs %}
We can implement a parent worker that sums the costs of the children's jobs using the getChildrenValues method. This method returns an object with job keys as keys and the result of that given job as a value:
import { Worker } from 'bullmq';
const renovateWorker = new Worker('renovate', async job => {
const childrenValues = await job.getChildrenValues();
const totalCosts = Object.values(childrenValues).reduce(
(prev, cur) => prev + cur,
0,
);
await sendInvoice(totalCosts);
});It is possible to add as deep job hierarchies as needed. See the following example where jobs are depending on each other, allowing serial execution of jobs:
{% tabs %}
{% tab title="TypeScript" %}
import { FlowProducer } from 'bullmq';
const flowProducer = new FlowProducer();
const queueName = 'assembly-line';
const chain = await flowProducer.add({
name: 'car',
data: { step: 'engine' },
queueName,
children: [
{
name: 'car',
data: { step: 'wheels' },
queueName,
children: [{ name: 'car', data: { step: 'chassis' }, queueName }],
},
],
});{% endtab %}
{% tab title="Python" %}
from bullmq import FlowProducer
flowProducer = FlowProducer()
queueName = 'assembly-line'
chain = await flowProducer.add({
"name": "car",
"data": { "step": "engine" },
"queueName": queueName,
"children": [
{
"name": "car",
"data": { "step": "wheels" },
"queueName": queueName,
"children": [{ "name": "car", "data": { "step": "chassis" }, "queueName": queueName }],
},
],
}){% endtab %}
{% tab title="Rust" %}
use bullmq::{FlowProducer, FlowProducerOptions, FlowJob};
let flow_producer = FlowProducer::new(FlowProducerOptions::default()).await?;
let queue_name = "assembly-line";
let chain = flow_producer.add(FlowJob {
name: "car".to_string(),
queue_name: queue_name.to_string(),
data: serde_json::json!({ "step": "engine" }),
opts: None,
prefix: None,
children: Some(vec![FlowJob {
name: "car".to_string(),
queue_name: queue_name.to_string(),
data: serde_json::json!({ "step": "wheels" }),
opts: None,
prefix: None,
children: Some(vec![FlowJob {
name: "car".to_string(),
queue_name: queue_name.to_string(),
data: serde_json::json!({ "step": "chassis" }),
opts: None,
prefix: None,
children: None,
}]),
}]),
}).await?;{% endtab %}
{% endtabs %}
In this case one job will be processed after the previous one has been completed.
{% hint style="info" %}
The order of processing would be: chassis, wheels and finally engine.
{% endhint %}
Getters
There are some special getters that can be used in order to get jobs related to a flow. First, we have a method in the Job class to get all the dependencies for a given job:
const dependencies = await job.getDependencies();it will return all the direct dependencies (i.e. the children of a given job).
Or if you want to get specific types of children:
// cursors are used in pagination
const { processed, nextProcessedCursor } = await job.getDependencies({
processed: {
count: 5,
cursor: 0,
},
});
const { unprocessed, nextUnprocessedCursor } = await job.getDependencies({
unprocessed: {
count: 5,
cursor: 0,
},
});
const { failed, nextFailedCursor } = await job.getDependencies({
failed: {
count: 5,
cursor: 0,
},
});
const { ignored, nextIgnoredCursor } = await job.getDependencies({
ignored: {
count: 5,
cursor: 0,
},
});The Job class also provides some other methods that we presented above
Get Dependencies Count
To get all the different counts of children by type:
const { failed, ignored, processed, unprocessed } =
await job.getDependenciesCount();Or if you want to be specific:
const { failed } = await job.getDependenciesCount({
failed: true,
});
const { ignored, processed } = await job.getDependenciesCount({
ignored: true,
processed: true,
});
const { unprocessed } = await job.getDependenciesCount({
unprocessed: true,
});Get Children Values
To get all the values produced by the children of a given job:
const values = await job.getChildrenValues();Also, a new property is available in the Job class, parentKey, with a fully qualified key for the job parent.
Finally, there is also a new state which a job can be in, "waiting-children", for parent jobs that have not yet had their children completed:
const state = await job.getState();
// state will be "waiting-children"Provide options
When adding a flow it is also possible to provide an extra object queueOptions object, in which you can add your specific options for every queue that is used in the flow. These options would affect each one of the jobs that are added to the flow using the FlowProducer.
import { FlowProducer } from 'bullmq';
const flowProducer = new FlowProducer();
const queueName = 'assembly-line';
const chain = await flowProducer.add(
{
name: 'car',
data: { step: 'engine' },
queueName,
children: [
{
name: 'car',
data: { step: 'wheels' },
queueName,
},
],
},
{
queuesOptions: {
[queueName]: {
defaultJobOptions: {
removeOnComplete: true,
},
},
},
},
);{% hint style="warning" %}
Queue options are defined in the context of their instances. You should provide your configurations in the second parameter in order to avoid unexpected behaviors.
{% endhint %}
Jobs removal
BullMQ also provides seamless removal functionality for jobs that are part of a flow.
When removing a job that is part of the flow there are several important considerations:
- If a parent job is removed, all its children will also be removed.
- If a child job is removed, its parent dependency to said child is also removed, and if the child was the last child in the dependencies list, the parent job will be completed.
- Since a job can be both a parent and a child in a large flow, both 1 and 2 will occur if removing such a job.
- If any of the jobs that would be removed happen to be locked, none of the jobs will be removed, and an exception will be thrown.
Apart from the considerations above, removing a job can simply be done by either using the Job or the Queue class:
await job.remove();
// or
await queue.remove(job.id);Read more:
- π Divide large jobs using flows
- π‘ FlowProducer API Reference
- π‘ Job API Reference
- π‘ Get Children Values API Reference
- π‘ Get Dependencies API Reference
- π‘ Get Dependencies Count API Reference
Overview (`docs/gitbook/guide/job-schedulers/README.md`)
Job Schedulers replace "repeatable jobs", and are available in v5.16.0 and onwards
Job Schedulers
A Job Scheduler acts as a factory , producing jobs based on specified "repeat" settings. The Job Scheduler is highly flexible, accommodating various scenarios, including jobs produced at fixed intervals, according to cron expressions, or based on custom requirements. For historical reasons, jobs produced by the Job Scheduler are often referred to as βRepeatable Jobsβ.
To create a scheduler, simply use the "upsertJobScheduler" method as demonstrated in the following example:
// Creates a new Job Scheduler that generates a job every 1000 milliseconds (1 second)
const firstJob = await queue.upsertJobScheduler('my-scheduler-id', {
every: 1000,
});This example will create a new Job Scheduler that will produce a new job every second. It will also return the first job created for this Job Scheduler, which will be in "delayed" status waiting to be processed after 1 second.
Now there are also a few important considerations that need to be explained here.:
- Upsert vs. Add: the 'upsert' is used instead of 'add' to simplify management of recurring jobs, especially in production deployments. It ensures the scheduler is updated or created without duplications.
- Job Production Rate: The scheduler will only generate new jobs when the last job begins processing. Therefore, if your queue is very busy, or if you do not have enough workers or concurrency, it is possible that you will get the jobs less frequently than the specified repetition interval.
- Job Status: As long as a Job Scheduler is producing jobs, there will be always one job associated to the scheduler in the "Delayed" status.
- UTC schedules: use
tz: 'UTC'in scheduler options when you need cron execution in UTC (instead of the removed legacyutcoption).
Using Job Templates
You can also define a template with standard names, data, and options for jobs added to a queue. This ensures that all jobs produced by the Job Scheduler inherit these settings:
// Create jobs every day at 3:15 (am)
const firstJob = await queue.upsertJobScheduler(
'my-scheduler-id',
{ pattern: '0 15 3 * * *' },
{
name: 'my-job-name',
data: { foo: 'bar' },
opts: {
backoff: 3,
attempts: 5,
removeOnFail: 1000,
},
},
);All jobs produced by this scheduler will use the given settings. Note that in the future you could call "upsertJobScheduler" again with the given "my-scheduler-id" in order to update any settings of this particular job scheduler, such as the repeat options or/and the job's template settings.
{% hint style="info" %}
Since jobs produced by the Job Scheduler will get a special job ID in order to guarantee that jobs will never be created more often than the given repeat settings, you cannot choose a custom job id. However you can use the job's name if you need to discriminate these jobs from other jobs.
{% endhint %}
Read more:
Overview (`docs/gitbook/guide/jobs/README.md`)
Jobs
Queues can hold different types of jobs, which determine how and when they are processed. In this section, we will describe them in detail.
An important thing to consider is that you can mix the different job types in the same queue, so you can add FIFO jobs, and at any moment add a LIFO or a delayed job.
Read more:
- π‘ Job API Reference
Overview (`docs/gitbook/guide/metrics/README.md`)
Metrics
BullMQ provides a simple metrics gathering functionality that allows you to track the performance of your queues. Workers can count the number of jobs they have processed per minute and store this data in a list inside Redis so that it can be queried later.
You enable it on the worker settings by specifying how many data points you want to keep, which basically are counters of the number of jobs that have been processed either completed or failed during 1 minute intervals.
As the metrics are aggregated in 1 minute intervals, using the recommended duration of 2 weeks of data should take a very small amount of total space, just around 120Kb of RAM per queue. The metrics will dispose older data points automatically so this RAM consumption will never increase after it reaches the maximum number of data points.
Check in this example how to enable metrics on a worker:
import { Worker, MetricsTime } from 'bullmq';
const myWorker = new Worker('Paint', {
connection,
metrics: {
maxDataPoints: MetricsTime.ONE_WEEK * 2,
},
});{% hint style="warning" %}
You need to use the same setting on all your workers to get consistent metrics.
{% endhint %}
In order to query the metrics, use the getMetrics method on the Queue class. You can choose to gather the metrics for the completed or failed jobs:
import { Queue } from 'bullmq';
const myQueue = new Queue('Paint', {
connection,
});
const metrics = await queue.getMetrics('completed', 0, MetricsTime.ONE_WEEK * 2);
/* Returns a Metrics object:
{
data: number[];
count: number;
meta: {
count: number;
prevTS: number;
prevCount: number;
};
}
*/Let's analyze what data we are getting back. First we have the meta field. The prevTS and prevCount subfields are used internally by the metrics system and should not be used, however you can use thecount subfield to get a total number for all completed or failed jobs, this counter is not just the number of completed jobs in the given interval, but since the queue started processing jobs.
The query also returns a data field which is an array where every position in the array represents 1 minute of time and has the total number of jobs that completed (or failed) in that minute.
Note that the getMetrics method also accepts a start and end argument (0 and -1 by default), that you can use if you want to implement pagination.
Read more:
- π‘ Get Metrics API Reference
- π‘ How to monitor and manage BullMQ queues, an overview of dashboards, metrics and alerts for BullMQ
Overview (`docs/gitbook/guide/nestjs/README.md`)
There is a compatible module to be used in NestJs.
npm i @nestjs/bullmqOnce the installation process is complete, we can import the BullModule into the root AppModule.
import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bullmq';
@Module({
imports: [
BullModule.forRoot({
connection: {
host: 'localhost',
port: 6379,
},
}),
],
})
export class AppModule {}To register a queue, import the BullModule.registerQueue() dynamic module, as follows:
BullModule.registerQueue({
name: 'queueName',
});To register a flow producer, import the BullModule.registerFlowProducer() dynamic module, as follows:
BullModule.registerFlowProducer({
name: 'flowProducerName',
});Processor
To register a processor, you may need to use the Processor decorator:
import { Processor, WorkerHost, OnWorkerEvent } from '@nestjs/bullmq';
import { Job } from 'bullmq';
@Processor('queueName')
class TestProcessor extends WorkerHost {
async process(job: Job<any, any, string>): Promise<any> {
// do some stuff
}
@OnWorkerEvent('completed')
onCompleted() {
// do some stuff
}
}And then register it as a provider:
@Module({
imports: [
BullModule.registerQueue({
name: 'queueName',
connection: {
host: '0.0.0.0',
port: 6380,
},
}),
BullModule.registerFlowProducer({
name: 'flowProducerName',
connection: {
host: '0.0.0.0',
port: 6380,
},
}),
],
providers: [TestProcessor],
})
export class AppModule {}Read more:
- π‘ Queues Technique
Overview (`docs/gitbook/guide/queues/README.md`)
Queues
A Queue is nothing more than a list of jobs waiting to be processed. The jobs can be small, message like, so that the queue can be used as a message broker, or they can be larger long running jobs.
Queues are controlled with the Queue class. As all classes in BullMQ, this is a lightweight class with a handful of methods that gives you control over the queue:
const queue = new Queue('Cars');{% hint style="info" %}
See Connections for details on how to pass Redis details to use by the queue.
{% endhint %}
When you instantiate a Queue, BullMQ will just upsert a small "meta-key", so if the queue existed before it will just pick it up and you can continue adding jobs to it.
The most important method is probably the add method. This method allows you to add jobs to the queue in different fashions:
await queue.add('paint', { color: 'red' });The code above will add a job named paint to the queue, with payload { color: 'red' }. This job will now be stored in Redis in a list waiting for some worker to pick it up and process it. Workers may not be running when you add the job, however as soon as one worker is connected to the queue it will pick the job and process it.
When adding a job you can also specify an options object. This options object can dramatically change the behaviour of the added jobs. For example you can add a job that is delayed:
await queue.add('paint', { color: 'blue' }, { delay: 5000 });The job will now wait at least 5 seconds before it is processed.
{% hint style="danger" %}
Prior to BullMQ 2.0, in order for delay jobs to work you need to have at least one QueueScheduler somewhere in your infrastructure. Read more here.
From BullMQ 2.0 and onwards, the QueueScheduler is not needed anymore.
{% endhint %}
There are many other options available such as priorities, backoff settings, lifo behaviour, remove-on-complete policies, etc. Please check the remainder of this guide for more information regarding these options.
Read more:
- π‘ Queue API Reference
Overview (`docs/gitbook/guide/redis-tm-compatibility/README.md`)
Redisβ’ Compatibility
There are several alternatives for Redis and even though BullMQ is full Redisβ’ compliant with version 6.2.0 or newer, not all the alternatives are going to work properly. In this section we present the vendors that officially support BullMQ and that we regularly test to verify they keep staying compatible.
Overview (`docs/gitbook/guide/redis-tm-hosting/README.md`)
For BullMQ you are going to need a proper Redisβ’ hosting solution. In this section we provide instructions on how to use some of the most popular ones.
Redisβ’ hosting
Overview (`docs/gitbook/guide/telemetry/README.md`)
Telemetry
BullMQ provides a Telemetry interface that can be used to integrate it with any external telemetry backends. Currently we support the OpenTelemetry specification, which is the new de-facto standard for telemetry purposes, however the interface if flexible enough to support any other backends in the future.
Telemetry is very useful for large applications where you want to get a detailed and general overview of the system. For BullMQ it helps to gain insight in the different statuses a job may be during its complete lifecycle. In a large application it helpts tracking the source of the jobs and all the interactions the jobs or messages may perform with other parts of the system.
Read more:
- π‘ How to monitor and manage BullMQ queues, an overview of dashboards, metrics and alerts for BullMQ
Overview (`docs/gitbook/guide/workers/README.md`)
Workers
Workers are the actual instances that perform some job based on the jobs that are added in the queue. A worker is equivalent to a "message" receiver in a traditional message queue. The worker's duty is to complete the job. If it succeeds, the job will be moved to the "completed" status. If the worker throws an exception during its processing, the job will automatically be moved to the "failed" status.
{% hint style="info" %}
Failed jobs can be automatically retried, see Retrying failing jobs
{% endhint %}
A worker is instantiated with the Worker class, and the work itself will be performed in the process function. Process functions are meant to be asynchronous, using either the async keyword or returning a promise.
import { Worker, Job } from 'bullmq';
const worker = new Worker(queueName, async (job: Job) => {
// Optionally report some progress
await job.updateProgress(42);
// Optionally sending an object as progress
await job.updateProgress({ foo: 'bar' });
// Do something with job
return 'some value';
});The processor function can also receive an optional third parameter for job cancellation support:
const worker = new Worker(
queueName,
async (job: Job, token?: string, signal?: AbortSignal) => {
// signal can be used to detect when a job has been cancelled
return 'some value';
},
);{% hint style="info" %}
Learn more about cancelling jobs in the dedicated guide.
{% endhint %}
{% hint style="info" %}
When a worker instance is created, it launches the processor immediately
{% endhint %}
In order to decide when your processor should start its execution, pass autorun: false as part of worker options:
import { Worker, Job } from 'bullmq';
const worker = new Worker(
queueName,
async (job: Job) => {
// Optionally report some progress
await job.updateProgress(42);
// Optionally sending an object as progress
await job.updateProgress({ foo: 'bar' });
// Do something with job
return 'some value';
},
{ autorun: false },
);
worker.run();Note that a processor can optionally return a value. This value can be retrieved either by getting the job and accessing the returnvalue property or by listening to the completed event:
worker.on('completed', (job: Job, returnvalue: any) => {
// Do something with the return value.
});Progress
Inside the worker process function it is also possible to emit progress events. Calling job.progress you can specify a number or an object if you have more complex needs. The progress event can be listened for in the same way as the completed event:
worker.on('progress', (job: Job, progress: number | object) => {
// Do something with the return value.
});Finally, when the process fails with an exception it is possible to listen for the failed event too:
worker.on('failed', (job: Job | undefined, error: Error, prev: string) => {
// Do something with the return value.
});It is also possible to listen to global events in order to get notifications of job completions, progress and failures:
import { QueueEvents } from 'bullmq';
const queueEvents = new QueueEvents('Paint');
queueEvents.on('completed', ({ jobId, returnvalue }) => {
// Called every time a job is completed by any worker.
});
queueEvents.on('failed', ({ jobId, failedReason }) => {
// Called whenever a job is moved to failed by any worker.
});
queueEvents.on('progress', ({ jobId, data }) => {
// jobId received a progress event
});Finally, you should attach an error listener to your worker to avoid NodeJS raising an unhandled exception when an error occurs. For example:
worker.on('error', err => {
// log the error
console.error(err);
});{% hint style="danger" %}
If the error handler is missing, your worker may stop processing jobs when an error is emitted! Find more info here.
{% endhint %}
Typescript typings
It is also possible to specify the data types for the Job data and return value using generics:
const worker = new Worker<MyData, MyReturn>(queueName, async (job: Job) => {});By default the job progress is typed as string | boolean | number | object. If you report progress with a specific shape, you can also specify a progress type so that updateProgress and the progress event are type-safe:
import { Worker, RedisQueueBackend } from 'bullmq';
type MyProgress = { percentage: number; message: string };
const worker = new Worker<
MyData,
MyReturn,
string,
RedisQueueBackend,
MyProgress
>(queueName, async job => {
// progress is checked against MyProgress
await job.updateProgress({ percentage: 42, message: 'halfway' });
});
worker.on('progress', (job, progress) => {
console.log(progress.percentage, progress.message);
});{% hint style="info" %}
The progress type must be JSON-serializable, as progress is persisted in the queue's backend. Sandboxed processors always receive the default progress type, since the value crosses a process boundary.
{% endhint %}
Read more:
Gitbook Guide Telemetry Getting Started (`docs/gitbook/guide/telemetry/getting-started.md`)
Getting started
In this guide we will show how to setup a local telemetry facility for BullMQ that should serve you as a good basis for how to integrate it in larger applications. As OpenTelemetry is a well supported standard there are many third party UIs for visualizing the traces and spans generated when running an application, for this guide we will use Jaeger.
We assume that you have a working BullMQ project that you want to add telemetry to it, so lets start by adding the bullmq-otel package to the project:
npm add --save bullmq-otelThis module provides a working implementation of BullMQ's telemetry interface for the OpenTelemetry standard. Adding it to your existing Queue's instances and Workers is quite straightforward:
import { Queue } from 'bullmq'
import { BullMQOtel } from "bullmq-otel";
const queue = new Queue("myQueue", {
connection: {
host: "127.0.0.1",
port: 6379,
},
telemetry: new BullMQOtel("simple-guide"),
});import { Worker } from "bullmq";
import { BullMQOtel } from "bullmq-otel";
const worker = new Worker(
"myQueue",
async (job) => {
return 'some value'
},
{
name: "myWorker",
connection: {
host: "127.0.0.1",
port: 6379,
},
telemetry: new BullMQOtel("simple-guide"),
}
);This is all that is needed in order to start producing traces and spans to observe your code.
Gitbook SUMMARY (`docs/gitbook/SUMMARY.md`)
Table of contents
Guide
- Introduction
- Connections
- PostgreSQL backend
- Queues
- Workers
- Jobs
- Job Schedulers
- Flows
- Metrics
- Rate limiting
- Parallelism and Concurrency
- Retrying failing jobs
- Returning job data
- Events
- Telemetry
- QueueScheduler
- Redisβ’ Compatibility
- Redisβ’ hosting
- Architecture
- NestJs
- Going to production
- Migrations
- Troubleshooting
Patterns
- Adding jobs in bulk across different queues
- Deduplication
- Manually processing jobs
- Named Processor
- Flows
- Idempotent jobs
- Throttle jobs
- Manual retrying
- Process Step Jobs
- Failing fast when Redis is down
- Stop retrying jobs
- Timeout jobs
- Timeout for Sandboxed processors
- Redis Cluster
BullMQ Pro
- Introduction
- Install
- Observables
- Groups
- Telemetry
- Batches
- NestJs
- API Reference
- Changelogs
- New Releases
- Support
Bull
Python
- Introduction
- Flow Producer
- Job Scheduler
- Lock Manager
- Global Concurrency and Rate Limit
- Job Cancellation
- Queue Events
- Changelogs
Rust
Elixir
PHP
.Net
Gitbook Changelog (`docs/gitbook/changelog.md`)
[6.3.16](https://github.com/taskforcesh/bullmq/compare/v6.3.15...v6.3.16) (2026-10-17)
Bug Fixes
[6.3.15](https://github.com/taskforcesh/bullmq/compare/v6.3.14...v6.3.15) (2026-10-14)
Bug Fixes
- job: respect priority when retrying a finished job (python) (elixir) (rust) (dotnet) (#4926) (afc9711)
[6.3.14](https://github.com/taskforcesh/bullmq/compare/v6.3.13...v6.3.14) (2026-10-13)
Bug Fixes
[6.3.13](https://github.com/taskforcesh/bullmq/compare/v6.3.12...v6.3.13) (2026-10-12)
Bug Fixes
- queue: move children retried by retryJobs back to their parent's dependencies (#4879) (3d82850), closes #4236
[6.3.12](https://github.com/taskforcesh/bullmq/compare/v6.3.11...v6.3.12) (2026-10-09)
Bug Fixes
- postgres: inline SQL at build time to restore single-file bundler support (#4822) (c6bc9a4), closes #4603
[6.3.11](https://github.com/taskforcesh/bullmq/compare/v6.3.10...v6.3.11) (2026-10-01)
Bug Fixes
- worker: detach stalled checker from telemetry context to prevent trace leak (#4812) fixes #4731 (01b8b14)
[6.3.10](https://github.com/taskforcesh/bullmq/compare/v6.3.9...v6.3.10) (2026-09-29)
Bug Fixes
[6.3.9](https://github.com/taskforcesh/bullmq/compare/v6.3.8...v6.3.9) (2026-09-25)
Bug Fixes
- connection: infer backend-specific connection options instead of hiding mismatches with casts (#4796) (10dc93c)
[6.3.8](https://github.com/taskforcesh/bullmq/compare/v6.3.7...v6.3.8) (2026-09-18)
Bug Fixes
[6.3.7](https://github.com/taskforcesh/bullmq/compare/v6.3.6...v6.3.7) (2026-09-18)
Bug Fixes
- deduplication: remove deduplication key if job key does not longer exist (python) (elixir) (php) (rust) (dotnet) (#4768) (75bb3a0)
[6.3.6](https://github.com/taskforcesh/bullmq/compare/v6.3.5...v6.3.6) (2026-09-14)
Bug Fixes
[6.3.5](https://github.com/taskforcesh/bullmq/compare/v6.3.4...v6.3.5) (2026-09-14)
Bug Fixes
[6.3.4](https://github.com/taskforcesh/bullmq/compare/v6.3.3...v6.3.4) (2026-09-01)
Bug Fixes
- Nothing changed, triggered by a Rust version release
[6.3.3](https://github.com/taskforcesh/bullmq/compare/v6.3.2...v6.3.3) (2026-08-31)
Bug Fixes
- bun: duplicate() and reconnect target the correct server (#4591) (e9b5679)
- worker: keep blocking client alive when parked in reconnecting (#4586) (8fd4850)
[6.3.2](https://github.com/taskforcesh/bullmq/compare/v6.3.1...v6.3.2) (2026-08-29)
Bug Fixes
- deps: upgrade msgpackr to 2.1.0 and uuid to 1.26.0 (rust) (#4621) (74987e9)
- worker: delegate maximumBlockTimeout to the backend (python) (#4644) (ea4543c)
[6.3.1](https://github.com/taskforcesh/bullmq/compare/v6.3.0...v6.3.1) (2026-08-27)
Bug Fixes
- Nothing changed, triggered by a elixir version release
[6.3.0](https://github.com/taskforcesh/bullmq/compare/v6.2.2...v6.3.0) (2026-08-26)
Features
[6.2.2](https://github.com/taskforcesh/bullmq/compare/v6.2.1...v6.2.2) (2026-08-25)
Performance Improvements
- queue: do not affect rate limit when processing deferred failures (python) (elixir) (rust) (dotnet) (#4607) (ec4be04)
[6.2.1](https://github.com/taskforcesh/bullmq/compare/v6.2.0...v6.2.1) (2026-08-25)
Bug Fixes
- Nothing changed, triggered by a elixir version release
[6.2.0](https://github.com/taskforcesh/bullmq/compare/v6.1.2...v6.2.0) (2026-08-21)
Features
[6.1.2](https://github.com/taskforcesh/bullmq/compare/v6.1.1...v6.1.2) (2026-08-16)
Bug Fixes
[6.1.1](https://github.com/taskforcesh/bullmq/compare/v6.1.0...v6.1.1) (2026-08-14)
Bug Fixes
[6.1.0](https://github.com/taskforcesh/bullmq/compare/v6.0.11...v6.1.0) (2026-08-12)
Features
[6.0.11](https://github.com/taskforcesh/bullmq/compare/v6.0.10...v6.0.11) (2026-08-10)
Bug Fixes
[6.0.10](https://github.com/taskforcesh/bullmq/compare/v6.0.9...v6.0.10) (2026-08-10)
Bug Fixes
[6.0.9](https://github.com/taskforcesh/bullmq/compare/v6.0.8...v6.0.9) (2026-08-07)
Bug Fixes
[6.0.8](https://github.com/taskforcesh/bullmq/compare/v6.0.7...v6.0.8) (2026-08-05)
Bug Fixes
- deps: avoid deep ioredis import so postgres backend works without ioredis internals (#4437) fixes #4435 (550e446)
- postgres: fail fast when SQL loader directory cannot be resolved (#4482) (f3936a2)
[6.0.7](https://github.com/taskforcesh/bullmq/compare/v6.0.6...v6.0.7) (2026-08-04)
Bug Fixes
[6.0.6](https://github.com/taskforcesh/bullmq/compare/v6.0.5...v6.0.6) (2026-08-03)
Bug Fixes
[6.0.5](https://github.com/taskforcesh/bullmq/compare/v6.0.4...v6.0.5) (2026-08-01)
Bug Fixes
- No Node.js changes.
[6.0.4](https://github.com/taskforcesh/bullmq/compare/v6.0.3...v6.0.4) (2026-08-01)
Bug Fixes
[6.0.3](https://github.com/taskforcesh/bullmq/compare/v6.0.2...v6.0.3) (2026-07-31)
Bug Fixes
[6.0.2](https://github.com/taskforcesh/bullmq/compare/v6.0.1...v6.0.2) (2026-07-31)
Bug Fixes
- No Node.js changes.
[6.0.1](https://github.com/taskforcesh/bullmq/compare/v6.0.0...v6.0.1) (2026-07-31)
Bug Fixes
- No Node.js changes.
[6.0.0](https://github.com/taskforcesh/bullmq/compare/v5.81.3...v6.0.0) (2026-07-30)
Features
- release BullMQ v6 with pluggable queue backends (php) (python) (elixir) (e1f86ef)
- Introduce the IQueueBackend abstraction, Redis and PostgreSQL backends, and the accompanying v6 updates across the supported language clients.
BREAKING CHANGES
- High-level classes no longer expose Redis internals. The optional Connection constructor parameter is replaced by an optional BackendFactory. Queue#client, Queue#redisVersion, Queue#databaseType, Worker#blockingClient, and FlowProducer#client are removed. Access the raw Redis client through the RedisQueueBackend returned by getBackend(). Worker#waitUntilReady() now resolves to void instead of the Redis client.
- Legacy repeatable jobs and their APIs are removed. This includes the repeat option on Queue#add and Queue#addBulk, the Repeat class, Queue#getRepeatableJobs(), Queue#removeRepeatable(), and Queue#removeRepeatableByKey(). Migrate recurring jobs to Job Schedulers.
- The minimum supported Node.js version is now 14.17.0.
- Worker#resume() is now asynchronous, returns
Promise<void>, and must be awaited. - Queue#clean() telemetry now reports the number of cleaned jobs instead of recording the complete array of job IDs.
- The deprecated TelemetryAttributes JobFinishedTimestamp and TelemetryAttributes.JobStatus members are removed. Telemetry uses JobState, and workers no longer set JobFinishedTimestamp on spans.
- Meter#createGauge() is now required for telemetry adapters.
- The deprecated debounce option and Job#debounceId property are removed. Use deduplication and Job#deduplicationId instead.
- The deprecated debounced event is removed. Listen for the deduplicated event instead.
- FlowJob now distinguishes parent and leaf nodes. Deduplication is no longer allowed on parent flow nodes.
- Job#discard() is removed from the Node.js API. Use UnrecoverableError instead.
- The legacy nextSchedulerJobId property is removed from Job and JobJson.
- ioredis is no longer installed as a direct dependency and is now an optional peer dependency. Redis users must install ioredis explicitly.
- The paused job state is removed from JobType and from the default Queue#getJobCounts() result. Jobs in a paused queue are represented as waiting.
- RepeatOptions no longer accepts the cron-parser currentDate, utc, or nthDayOfWeek options. Use tz: 'UTC' instead of utc: true.
- The public Redis implementation exports Scripts, createScripts, JobJsonRaw, and RedisJobOptions are removed. Use the backend APIs instead.
Gitbook Quick Start (`docs/gitbook/quick-start.md`)
Quick Start
Install
Install using npm:
$ npm install bullmqInstall using yarn:
$ yarn add bullmq{% hint style="info" %}
BullMQ is written in TypeScript, and although it can be used in vanilla JavaScript, all examples in this guide will be written in TypeScript.
{% endhint %}
Import into your project and add some jobs:
import { Queue } from 'bullmq';
const myQueue = new Queue('foo');
async function addJobs() {
await myQueue.add('myJobName', { foo: 'bar' });
await myQueue.add('myJobName', { qux: 'baz' });
}
await addJobs();{% hint style="danger" %}
You need to have a Redis service running in your local computer to run these examples successfully. You can read more about Redis connections here.
{% endhint %}
Jobs are added to the queue and can be processed at any time, with at least one Node.js process running a worker:
import { Worker } from 'bullmq';
import IORedis from 'ioredis';
const connection = new IORedis({ maxRetriesPerRequest: null });
const worker = new Worker(
'foo',
async job => {
// Will print { foo: 'bar'} for the first job
// and { qux: 'baz' } for the second.
console.log(job.data);
},
{ connection },
);{% hint style="info" %}
You can have as many worker processes as you want, BullMQ will distribute the jobs across your workers in a round robin fashion.
{% endhint %}
You can listen to completed (or failed) jobs by attaching listeners to the workers:
worker.on('completed', job => {
console.log(`${job.id} has completed!`);
});
worker.on('failed', (job, err) => {
console.log(`${job.id} has failed with ${err.message}`);
});{% hint style="info" %}
There are many other events available, check the Guide or the API reference for more information.
{% endhint %}
Sometimes you need to listen to all the workers events in a given place, for this you need to use a special class QueueEvents:
import { QueueEvents } from 'bullmq';
const queueEvents = new QueueEvents('my-queue-name');
queueEvents.on('waiting', ({ jobId }) => {
console.log(`A job with ID ${jobId} is waiting`);
});
queueEvents.on('active', ({ jobId, prev }) => {
console.log(`Job ${jobId} is now active; previous status was ${prev}`);
});
queueEvents.on('completed', ({ jobId, returnvalue }) => {
console.log(`${jobId} has completed and returned ${returnvalue}`);
});
queueEvents.on('failed', ({ jobId, failedReason }) => {
console.log(`${jobId} has failed with reason ${failedReason}`);
});You may also access the timestamp of the event, which looks like "1580456039332-0".
import { QueueEvents } from 'bullmq';
const queueEvents = new QueueEvents('my-queue-name');
queueEvents.on('progress', ({ jobId, data }, timestamp) => {
console.log(`${jobId} reported progress ${data} at ${timestamp}`);
});{% hint style="danger" %}
For performance reasons, the events emitted by a QueueEvents instance do not contain the Job instance, only the jobId. Use the Job.fromId method if you need the Job instance.
{% endhint %}
Elixir Docs Transactional Jobs Design (`elixir/docs/transactional-jobs-design.md`)
Design: Transactional Jobs (Postgres backend)
Status: Proposal / feasibility note
Applies to: BullMQ.Backends.Postgres only (not Redis)
Goal
Let a job's processor run its own database work inside the same transaction
that BullMQ uses to complete the job, so that the business-logic writes and the
job completion commit atomically together. If either fails, both roll back β
which removes the classic at-least-once double-write window and makes idempotent
processors unnecessary.
Why this is possible with Postgres (and impossible with Redis)
The completion protocol on the Postgres backend is already a single SQL function,move_to_completed(...), invoked from the adapter's run/3 helper. That
function is transaction-agnostic: it works the same whether it runs on a
pooled connection or inside a caller-supplied BEGIN β¦ COMMIT. That is the only
hook required.
Redis cannot do this: arbitrary user SQL can't be enrolled into a MULTI/EXEC.
The problem today: two commits
Processing currently spans two separate transactions:
move_to_activeβ commit (job becomes locked and visible asactive)- processor runs (user side effects, in the user's own transaction)
move_to_completedβ separate commit
The gap between (2) and (3) is the at-least-once window: if the worker crashes
after the user's writes commit but before completion commits, the lock expires β
the job is treated as stalled β it is reclaimed and reprocessed β double side
effects. This is why processors must be idempotent.
The design: share only _process + complete_
You must not fold the claim (move_to_active) into the shared transaction.
An uncommitted "active" state is invisible to other transactions, so two workers
could claim the same job. Locking depends on the claim being committed.
Instead, fold only process + complete into one transaction. The lock acquired
at claim time provides mutual exclusion; the shared transaction provides
atomicity of side-effects + completion:
# 1. Claim stays a separate commit β job is locked and visible as active.
move_to_active(backend, token, opts)
# 2. Process + complete share ONE transaction β single COMMIT.
Postgrex.transaction(pool, fn conn ->
result = processor.(job, conn) # user's queries run on THIS conn
Postgrex.query!(conn, move_to_completed_sql, params) # same tx
result
end)Guarantees
- Crash mid-processing (before COMMIT): the user's writes roll back; the job
staysactiveand locked β reclaimed β clean retry. No partial side effects,
so no idempotence needed. - Lock expired mid-processing (slow job):
move_to_completeddetects the
token mismatch and fails, so the entire transaction β including the user's
writes β rolls back. This is exactly the "never double-write" property: a
worker whose lease expired can never commit its side effects.
What would change in the code
| Piece | Change | Effort |
|---|---|---|
| SQL | none β move_to_completed already runs in any transaction |
none |
| Backend adapter | add a connection-scoped variant of the completion path (run/3 currently hardcodes the pool) + an optional callback, e.g. complete_in_transaction/3 |
Moderate |
| Worker | wrap processor + completion in Postgrex.transaction, thread conn into the processor |
Moderate |
| Processor API | give the processor the transaction handle (processor.(job, tx) or job.tx) |
Small |
BullMQ.Backend behaviour |
mark it an optional, backend-specific capability (Redis returns "unsupported") | Small |
The hard / careful parts
- Pool sizing. A transactional job holds a dedicated connection for its
entire duration; concurrency is then bounded bypool_sizeand long jobs pin
connections. Requirespool_size β₯ in-flight transactional jobs. This is the
main operational trade-off vs Redis (which releases connections between ops). - Ecto integration. Trivial if the processor uses the raw Postgrex
connwe
hand it; harder if users want their Ecto Repo calls to join the
transaction (Ecto doesn't cleanly adopt an external Postgrex connection). This
is the biggest integration question and dictates the public API shape. move_to_failed. Usually you want the opposite: roll back the user's work
but still persist the failure. So failures can't share the commit β roll
back the user transaction, then record the failure separately.fetch_nextfast path. The fused claim-next-job optimization must be
disabled for transactional jobs (the next claim would be uncommitted until the
outer commit) or handled specially.- Lock renewal. Fine as-is:
extend_lockruns on a separate connection and
the completion transaction only touches the job row at the very end, so there
is no lock contention during the long user work.
Verdict
Very feasible β moderate effort for raw-Postgrex processors, more for Ecto
integration. The core is roughly a few hundred lines plus one optional
behaviour callback, because the SQL already supports it. It is essentially the
"transactional job" / exactly-once-via-shared-transaction pattern offered by
Oban Pro and River (Go), and it is a real differentiator the Redis backend can
never match.
Two things to settle before committing to it:
- the Ecto story (it determines the public API), and
- an explicit pool-sizing contract so long jobs don't starve the pool.
Gitbook Bull Important Notes (`docs/gitbook/bull/important-notes.md`)
Important Notes
The queue aims for an "at least once" working strategy. This means that in some situations, a job could be processed more than once. This mostly happens when a worker fails to keep a lock for a given job during the total duration of the processing.
When a worker is processing a job it will keep the job "locked" so other workers can't process it.
It's important to understand how locking works to prevent your jobs from losing their lock - becoming stalled - and being restarted as a result. Locking is implemented internally by creating a lock for lockDuration on interval lockRenewTime (which is usually half lockDuration). If lockDuration elapses before the lock can be renewed, the job will be considered stalled and is automatically restarted; it will be double processed. This can happen when:
- The Node process running your job processor unexpectedly terminates.
- Your job processor was too CPU-intensive and stalled the Node event loop, and as a result, Bull couldn't renew the job lock (see #488 for how we might better detect this). You can fix this by breaking your job processor into smaller parts so that no single part can block the Node event loop. Alternatively, you can pass a larger value for the
lockDurationsetting (with the tradeoff being that it will take longer to recognize a real stalled job).
As such, you should always listen for the stalled event and log this to your error monitoring system, as this means your jobs are likely getting double-processed.
As a safeguard so problematic jobs won't get restarted indefinitely (e.g. if the job processor always crashes its Node process), jobs will be recovered from a stalled state a maximum of maxStalledCount times (default: 1).
Gitbook Bull Install (`docs/gitbook/bull/install.md`)
Install
Install with Npm:
npm install bull --saveor Yarn:
yarn add bullIn order to work with Bull, you also need to have a Redis server running. For local development you can easily install it using docker.
Bull will by default try to connect to a Redis server running on localhost:6379
{% hint style="info" %}
Bull requires a Redis version greater than or equal to 2.8.18.
{% endhint %}
Typescript Definitions
npm install @types/bull --save-devyarn add --dev @types/bullDefinitions are currently maintained in the DefinitelyTyped repo.
Gitbook Bull Introduction (`docs/gitbook/bull/introduction.md`)
Introduction
Bull is the legacy version of BullMQ. As it is still heavily used today, it is also maintained for bugs but not for new major features. If you want to use a battle-tested queue library and you do not need a better typescript integration or the latest features you are good to go using this library for years to come.
Used by
Bull has been a part of the NodeJS ecosystem for a long time and is used by many organizations both in commercial and open-source projects. A few special mentions:
.png>)
.png>)
.png>)
Gitbook Bull Quick Guide (`docs/gitbook/bull/quick-guide.md`)
Quick Guide
**Basic Usage**
/* Detailed source-code truncated for AI context efficiency. */**Using promises**
Alternatively, you can use return promises instead of using the done callback:
videoQueue.process(function (job) {
// don't forget to remove the done callback!
// Simply return a promise
return fetchVideo(job.data.url).then(transcodeVideo);
// Handles promise rejection
return Promise.reject(new Error("error transcoding"));
// Passes the value the promise is resolved with to the "completed" event
return Promise.resolve({ framerate: 29.5 /* etc... */ });
// If the job throws an unhandled exception it is also handled correctly
throw new Error("some unexpected error");
// same as
return Promise.reject(new Error("some unexpected error"));
});**Sandboxed processes**
The process function can also be run in a separate process. This has several advantages:
- The process is sandboxed so if it crashes it does not affect the worker.
- You can run blocking code without affecting the queue (jobs will not stall).
- Better utilization of multi-core CPUs.
- Less connections to redis.
In order to use this feature just create a separate file with the processor:
// processor.js
module.exports = function (job) {
// Do some heavy work
return Promise.resolve(result);
}And define the processor like this:
// Single process:
queue.process('/path/to/my/processor.js');
// You can use concurrency as well:
queue.process(5, '/path/to/my/processor.js');
// and named processors:
queue.process('my processor', 5, '/path/to/my/processor.js');**Repeated jobs**
A job can be added to a queue and processed repeatedly according to a cron specification:
paymentsQueue.process(function (job) {
// Check payments
});
// Repeat payment job once every day at 3:15 (am)
paymentsQueue.add(paymentsData, { repeat: { cron: "15 3 * * *" } });As a tip, check your expressions here to verify they are correct: cron expression generator
**Pause / Resume**
A queue can be paused and resumed globally (pass true to pause processing for just this worker):
queue.pause().then(function () {
// queue is paused now
});
queue.resume().then(function () {
// queue is resumed now
});**Events**
A queue emits some useful events, for example...
myqueue.on('completed', function (job, result) {
// Job completed with output result!
})For more information on events, including the full list of events that are fired, check out the Events reference
**Queues performance**
Queues are relative cheap, so if you need many of them just create new ones with different names. However having too many queues can become unmanageable. Up to a dozen is normally ok.
const userJohn = new Queue('john');
const userLisa = new Queue('lisa');
.
.
.Also keep in mind that every queue instance will require new redis connections, check how to reuse connections or you can also use named processors to achieve a similar result.
**Cluster support**
{% hint style="info" %}
From version 3.2.0 and above it is recommended to use threaded processors instead.
{% endhint %}
Queues are robust and can be run in parallel in several threads or processes without any risk of hazards or queue corruption. Check this simple example using cluster to parallelize jobs across processes:
const Queue = require("bull");
const cluster = require("cluster");
const numWorkers = 8;
const queue = new Queue("test concurrent queue");
if (cluster.isMaster) {
for (let i = 0; i < numWorkers; i++) {
cluster.fork();
}
cluster.on("online", function (worker) {
// Let's create a few jobs for the queue workers
for (let i = 0; i < 500; i++) {
queue.add({ foo: "bar" });
}
});
cluster.on("exit", function (worker, code, signal) {
console.log("worker " + worker.process.pid + " died");
});
} else {
queue.process(function (job, jobDone) {
console.log("Job done by worker", cluster.worker.id, job.id);
jobDone();
});
}Gitbook Bullmq Pro Batches (`docs/gitbook/bullmq-pro/batches.md`)
Batches
It is possible to configure workers so that instead of processing one job at a time they can process up to a number of jobs (a so-called batch) in one go. Workers using batches have slightly different semantics and behavior than normal workers, so read carefully the following examples to avoid pitfalls.
To enable batches, pass the batch option with a size property representing the maximum number of jobs per batch:
const worker = new WorkerPro(
'My Queue',
async (job: JobPro) => {
const batch = job.getBatch();
for (let i = 0; i < batch.length; i++) {
const batchedJob = batch[i];
await doSomethingWithBatchedJob(batchedJob);
}
},
{ connection, batch: { size: 10 } },
);{% hint style="info" %}
There is no strict maximum limit for the size of batches; however, keep in mind that larger batches introduce overhead proportional to their size, which could lead to performance issues. Typical batch sizes range between 10 and 50 jobs.
{% endhint %}
New Batch Options: `minSize` and `timeout`
In addition to the size option, two new optionsβminSize and timeoutβprovide greater control over batch processing:
minSize: Specifies the minimum number of jobs required before the worker processes a batch. The worker will wait until at least minSize jobs are available before fetching and processing them, up to the size limit. If fewer than minSize jobs are available, the worker waits indefinitely unless a timeout is also set.timeout: Defines the maximum time (in milliseconds) the worker will wait for minSize jobs to accumulate. If the timeout expires before minSize is reached, the worker processes whatever jobs are available, up to the size limit. If minSize is not set the timeout option is effectively ignored, as the worker batches only available jobs.
{% hint style="info" %}
Important: Without groupAffinity, minSize and timeout are not compatible with groups. When groups are used without groupAffinity, the worker ignores minSize and batches only the currently available jobs without waiting.
{% endhint %}
Hereβs an example configuration using both minSize and timeout:
const worker = new WorkerPro(
'My Queue',
async (job: JobPro) => {
const batch = job.getBatch();
for (let i = 0; i < batch.length; i++) {
const batchedJob = batch[i];
await doSomethingWithBatchedJob(batchedJob);
}
},
{
connection,
batch: {
size: 10, // Maximum jobs per batch
minSize: 5, // Wait for at least 5 jobs
timeout: 30_000, // Wait up to 30 seconds
},
},
);In this example:
- The worker waits for at least 5 jobs to become available, up to a maximum of 10 jobs per batch.
- If 5 or more jobs are available within 30 seconds, it processes the batch (up to 10 jobs).
- If fewer than 5 jobs are available after 30 seconds, it processes whatever jobs are present, even if below
minSize.
Group Affinity
When using batches together with groups, by default a single batch can contain jobs from different groups. The groupAffinity option guarantees that every batch is homogeneous: it contains either all non-group jobs or all jobs from the same group. Groups are still served in round-robin order across batches.
const worker = new WorkerPro(
'My Queue',
async (job: JobPro) => {
const batch = job.getBatch();
// Every job in this batch belongs to the same group (or none).
const groupId = batch[0].gid;
for (const batchedJob of batch) {
await doSomethingWithBatchedJob(batchedJob);
}
},
{
connection,
batch: { size: 10, groupAffinity: true },
},
);Behavior details
- Non-group jobs first. If there are non-group jobs waiting in the queue, they are drained before any group jobs, ensuring that non-group jobs are never starved.
- Round-robin across batches. Each batch picks the next group in rotation order. After a batch is fetched from group A, the next batch will target the next group in line.
- Partial batches. If the target group has fewer jobs than
size, or if a group concurrency / rate limit is hit mid-batch, the batch is returned with fewer jobs rather than mixing in jobs from another group. minSizeandtimeoutsupport. WhengroupAffinityis enabled,minSizeapplies to the next group in rotation: the worker waits until that group has at leastminSizejobs before fetching a batch. Thetimeoutoption works as usualβifminSizeis not reached before the timeout expires, the worker processes whatever jobs are available in that group.
Batch concurrency (one in-flight batch per group)
If you need to ensure that only one batch per group is being processed at a time, set group.concurrency equal to batch.size. Since one full batch fills all the concurrency slots for that group, no second batch can start until the first completes:
const batchSize = 10;
const worker = new WorkerPro(
'My Queue',
async (job: JobPro) => {
const batch = job.getBatch();
await processBatch(batch);
},
{
connection,
batch: { size: batchSize, groupAffinity: true },
group: { concurrency: batchSize },
},
);{% hint style="info" %}
With group.concurrency equal to batch.size, batches within the same group are serialized while batches from different groups can still run in parallel across multiple workers.
{% endhint %}
Failing jobs
When using batches, the default is that if the processor throws an exception, all jobs in the batch will fail.
To fail specific jobs instead, use the setAsFailed method on individual jobs within the batch:
const worker = new WorkerPro(
'My Queue',
async (job: JobPro) => {
const batch = job.getBatch();
for (let i = 0; i < batch.length; i++) {
const batchedJob = batch[i];
try {
await doSomethingWithBatchedJob(batchedJob);
} catch (err) {
batchedJob.setAsFailed(err);
}
}
},
{ connection, batch: { size: 10 } },
);Only jobs explicitly marked with setAsFailed will fail; the remaining jobs in the batch will complete successfully once the processor finishes.
Handling events
Batches are managed by wrapping all jobs in a batch into a dummy job that holds the jobs in an internal array. This simplifies batch processing but affects event handling. For example, worker-level event listeners (e.g., worker.on('completed', ...)) report events for the dummy batch job, not the individual jobs within it.
To retrieve the jobs in a batch from an event handler, use the getBatch method:
worker.on('completed', job => {
const batch = job.getBatch();
// ...
});Using a global event listener you can listen to individual job events even though they may be processed in a batch:
import { QueueEventsPro } from '@taskforcesh/bullmq-pro';
const queueEvents = new QueueEventsPro(queueName, { connection });
queueEvents.on('completed', (jobId, err) => {
// ...
});Limitations
Currently, all worker options can be used with batches, however, there are some unsupported features that may be implemented in the future:
Gitbook Bullmq Pro Changelog (`docs/gitbook/bullmq-pro/changelog.md`)
[7.49.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.4...v7.49.0) (2026-10-15)
Features
[7.48.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.3...v7.48.4) (2026-10-14)
Bug Fixes
[7.48.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.2...v7.48.3) (2026-09-26)
Bug Fixes
[7.48.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.1...v7.48.2) (2026-09-25)
Bug Fixes
- worker: keep group options in job scheduler iterations (#476) (1d4c5ad), closes taskforcesh/bullmq-pro-support#115
[7.48.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.0...v7.48.1) (2026-09-11)
Bug Fixes
[7.48.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.47.1...v7.48.0) (2026-08-31)
Features
[7.47.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.47.0...v7.47.1) (2026-08-23)
Bug Fixes
[7.47.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.6...v7.47.0) (2026-08-15)
Features
[7.46.6](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.5...v7.46.6) (2026-08-13)
Bug Fixes
[7.46.5](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.4...v7.46.5) (2026-08-13)
Bug Fixes
- worker: stop fetching next jobs when closing on manual job movement (#4178) fixes #4163 (7b9f7e0)
- flow: respect parent attribute deletion from child when calling removeChildDependency (#4169) (6396b4e)
- build: remove source map generation (#4167) (41713ca)
- scheduler: align first 'every' job to the next offset slot (#4113) fixes #3705 (1b8f900)
- deps: update dependency semver to v7.8.0 [security] (#4160) (093743a)
- connection: reconnect wedged blocking cluster clients (#4151) (e94e8cd)
[7.46.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.3...v7.46.4) (2026-08-13)
Bug Fixes
[7.46.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.2...v7.46.3) (2026-08-07)
Bug Fixes
[7.46.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.1...v7.46.2) (2026-06-19)
Bug Fixes
[7.46.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.0...v7.46.1) (2026-06-04)
Bug Fixes
[7.46.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.45.1...v7.46.0) (2026-05-21)
Features
[7.45.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.45.0...v7.45.1) (2026-05-07)
Bug Fixes
[7.45.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.44.0...v7.45.0) (2026-05-01)
Features
[7.44.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.43.1...v7.44.0) (2026-04-15)
Features
[7.43.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.43.0...v7.43.1) (2026-04-08)
Bug Fixes
[7.43.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.42.1...v7.43.0) (2026-03-11)
Bug Fixes
auto-remove: remove orphaned jobs when auto-remove is enabled (#3853) (504b536)
deps: update dependency ioredis to v5.9.3 (#3821) fixes #3793 (0fafcc0)
sandbox: ensure non-bullmq messages are ignored (#3704) fixes #3703 (9c72258)
job-scheduler: handle empty scheduler hash fallback (#3797) fixes #3796 (87386ca)
queue: forward error from repeat or job-scheduler instances (#3775) fixes #3774 (a62241f)
connection: merge redisOptions when duplicating cluster (#3759) (afb878f)
Features
- worker: add cancelation support to sandboxed processors (#3806) (0d3879b)
- otel: enable metrics (#3769) (f85e870)
- connection: add datatype for version differentiation (#3746) (af9197d)
[7.42.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.42.0...v7.42.1) (2026-02-12)
Bug Fixes
[7.42.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.41.1...v7.42.0) (2026-01-28)
Bug Fixes
- deps: use caret versioning for ioredis dependency (#3719) fixes #3718 (de0fca8)
- fix worker connection name on cluster #3340 (elixir) (python) (#3660) (fa22e84)
- deps: update dependency ioredis to v5.9.2 (#3713) (87e74b5)
- deps: update dependency ioredis to v5.9.1 (#3676) fixes #3667 (661c581)
- flow: remove debounce option from flow producer (#3646) (cc74805)
Features
- job: add job name and id as telemetry attributes in complete, retry, delay and failed spans (#3707) ref #3692 (6294b36)
Performance Improvements
[7.41.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.41.0...v7.41.1) (2026-01-19)
Bug Fixes
[7.41.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.40.3...v7.41.0) (2025-12-28)
Bug Fixes
- flow: remove deduplication option from flow producer (#3637) (f60c172)
- telemetry: send most updated attemptsMade value when finishing (#3623) (1380a16)
- deps: pin dependencies (#3609) (5fbf778)
Features
- job: allow resetting attemptsMade and attemptsStarted attributes on retry (#3596) ref #2152 (241d847)
[7.40.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.40.2...v7.40.3) (2025-12-08)
Bug Fixes
- job: remove deferredFailure when moving job to failed
- stalled: prevent lock errors while job is not longer in active state (#3579) (a8b9d76)
- connection: consider error code when checking connection error (#3537) (045f3e7)
Features
- job: support removeDeduplicationKey method (#3575) (b059cfc)
- worker: add job cancellation (#3564) (f41f5d0)
Performance Improvements
[7.40.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.40.1...v7.40.2) (2025-11-25)
Bug Fixes
[7.40.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.40.0...v7.40.1) (2025-11-15)
Bug Fixes
[7.40.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.39.3...v7.40.0) (2025-11-04)
Bug Fixes
- queue: emit progress event when calling updateJobProgress (#3528) (c82df83)
- upsertJobScheduler does not apply change on existing scheduled job (#3524) (98f73b3), closes #3500
- worker: only emit error when moveToActive failed (0aa7cc5)
- queue: emit removed event when calling remove method (#3492) fixes #2668 (7a3f2fa1)
- worker: emit error once when failure happens in moveToFinished (#3498) (4b4bd97e)
- worker: do not retry processor when connection errors happen (#3482) (f1573b3)
- job-scheduler: fix unstable upsert (#3446) (2241101)
Features
- queue: support getMeta method (#3513) (e212d1c)
- queue: support getGlobalRateLimit method (#3511) (6a31e0a)
- queue: add removeGlobalRateLimit method (#3481) (d3fff80)
- queue: support global rate limit (#3468) ref #3019 (bef57a0)
- deduplication: support replace option in single mode (#3472) (eea35b7)
- sandbox: support mjs files (#3476) ref #3474 (2e2b214)
- worker: support maxStartedAttempts option (#3331) (9384a64)
Performance Improvements
- worker: call moveToActive after special errors (#3497) (37e9db5)
- worker: only consider infinity retry on connection errors (#3473) (9d5a678)
- metrics: use lua script when calling getMetrics (#3459) (61987c6)
[7.39.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.39.2...v7.39.3) (2025-10-08)
Bug Fixes
[7.39.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.39.1...v7.39.2) (2025-10-04)
Bug Fixes
- job: add custom jobId validation to prevent : inclusion (#3384) fixes #3382 (845a6f5)
- deps: upgrade uuid to v11 (#3452) (bd8fbc1)
- events: set prev param as active when calling retryJob script (#3426) (e0ebd15)
- deduplication: validate id option is provided (#3443) fixes #3432 (533b844)
[7.39.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.39.0...v7.39.1) (2025-09-20)
Bug Fixes
[7.39.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.38.5...v7.39.0) (2025-09-18)
Bug Fixes
- queue: preserve Job type inference when no explicit type for JobBase (#3423) fixes #3421 (f642818)
- types: export Processor type (#3418) (70e8a3f)
- job-scheduler: consider undefined type in getJobScheduler return type (#3412) (ffc6e26)
- job: consider parent update when retrying (#3402) (python) fixes #3320 (316d1ed)
- job: prevent unnecessary tryCatch calls in getTraces (#3400) (d71b872)
Features
- worker: adds jobName and attemptsMade span attributes when processJob is called (#3199) (db0a922)
- sandbox: support moveToWaitingChildren method (#3389) (0fecc6c)
[7.38.5](https://github.com/taskforcesh/bullmq-pro/compare/v7.38.4...v7.38.5) (2025-09-05)
Bug Fixes
[7.38.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.38.3...v7.38.4) (2025-08-14)
Bug Fixes
- scheduler: consider startDate to generate nextMillis when using pattern (#3385) fixes #3378 (53754fb)
[7.38.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.38.2...v7.38.3) (2025-08-06)
Bug Fixes
- worker: emit failed event when children are failed in moveToWaitingChildren (#3346) (93df852)
- queue: add support for 'waiting' parameter in clean method (#3338) fixes #3125 (edb7147)
- flow: remove parent from active when there are unsuccessful children (#3348) (34ee339)
- worker: do not keep active jobs when pausing or closing (#3350) fixes #3349 (424d155)
- repeat: use legacy updateRepeatableJob script when old format is present (#3364) fixes #3275 (1e221d5)
- rate-limit: throw right error message if job does not exist (#3354) (83d9695)
[7.38.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.38.1...v7.38.2) (2025-07-18)
Bug Fixes
- scheduler: take offset into the startMillis calculation (#2944) fixes #247 (1e3f3c5)
- connection: ignore info command when skipVersionCheck is provided as true (#3342) fixes #3341 (b94d7ed)
[7.38.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.38.0...v7.38.1) (2025-07-15)
Bug Fixes
Performance Improvements
- worker: do not wait rate limit when fetching jobs (#3322) (c32e6a0)
- woker: keep lower blockTimeout when consuming delayed markers (#3333) (e687d7c)
[7.38.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.37.0...v7.38.0) (2025-07-11)
Features
[7.37.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.36.0...v7.37.0) (2025-07-10)
Bug Fixes
- avoid circular reference between scripts and queue (#3301) (fb65677)
- scheduler: fix slot calculation when using every (#3307) (588719e)
Features
Performance Improvements
[7.36.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.35.2...v7.36.0) (2025-07-09)
Bug Fixes
- deps: address brace-expansion vulnerability with v1.1.12 (240b0b5)
- job-scheduler: support for groups (#345) (467544e)
- flow: add new error code when parent has failed children (#3268) (b8fba5e)
- job: do not parse ignored failures in getDependencies (#3284) fixes #3283 (04ca6b5)
- scheduler: remove current job when it is in delayed state (#3269) fixes #3262 #3272 (1ca4cbd)
- worker: avoid dangling jobs to hang the queue with rate limit (#3297) fixes #3289 (263d33d)
Features
- sandbox: add getIgnoredChildrenFailures method in job's wrapper (#3263) (5d2723d)
- backoff: add jitter option (#3291) (86c4c6d)
Performance Improvements
[7.35.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.35.1...v7.35.2) (2025-05-23)
Bug Fixes
[7.35.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.35.0...v7.35.1) (2025-05-16)
Bug Fixes
- remove: pass correct children meta references (#3245) (01c62ad)
- worker: maxStalledCount no less than 0 (#3249) fixes #3248 (34dcb8c)
[7.35.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.34.0...v7.35.0) (2025-05-02)
Bug Fixes
- deduplication: remove deduplication key only when jobId matches with the last one being saved (#3236) (192e82c)
- job-scheduler: remove next delayed job if present even if scheduler does not exist (#3203) ref #3197 (61395bf)
- queue-events: omit telemetry options (#3239) (e4dac2c)
Features
- queue: add getIgnoredChildrenFailures method (#3194) (4affb11)
- flow: support ignored children in getFlow and getDependencies methods (#3238) ref #3213 (2927803)
- flow: support failed children in getFlow and getDependencies methods (#3243) (d3b1cff)
[7.34.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.33.0...v7.34.0) (2025-04-30)
Bug Fixes
- flow-producer: fix queueName otel attribute when passing it to addNode (#3198) (758ea26)
- flow: remove job from dependencies when failParentOnFailure or continueParentOnFailure (#3201) (1fbcbec)
- job-scheduler: fix endDate presence validation (#3195) (339f13e)
- made line split more compatible (#3208) (3c2349a), closes #3204
- flow-producer: use FlowProducer prefix by defualt when calling getFlow (#3224) (bd17aad)
Features
- flows: add continueParentOnFailure option (#3181) (738d375)
- add removeUnprocessedChildren (#3190) (4b96266)
- job: expose stalledCounter attribute (#3218) (9456472)
Performance Improvements
[7.33.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.32.2...v7.33.0) (2025-04-17)
Bug Fixes
- job: deserialize priority in fromJSON (#3126) (c3269b1)
- scheduler: remove multi when updating a job scheduler (#3108) (4b619ca)
- flow: consider to fail a parent not in waiting-children when failParentOnFailure is provided (#3098) (589adb4)
- job-scheduler: restore iterationCount attribute (#3134) (eec7114)
- job-scheduler: add marker when upserting job scheduler if needed (#3145) (0e137b2)
- flow: consider prioritized state when moving a parent to failed (#3160) (d91d9f4)
- flow: only validate pending dependencies when moving to completed (#3164) (d3c397f)
- scheduler: remove next delayed job when possible (#3153) (219c0db)
- job-scheduler: emit duplicated event when next delayed job exists (#3172) (d57698f)
- flow: validate pending dependencies before removing lock (#3182) (8d59e3b)
- queue-events: pass right path for JobProgress type (#3192) fixes #3191 (33c62e6)
- fix manual retries so that they honor groups max concurrency (#332) (5fffdc6)
Features
- job: add complete span in moveToCompleted method (#3132) (c37123c)
- job: support ignored and failed counts in getDependenciesCount (#3137) ref #3136 (83953db)
- prometheus export: expose global variables (0325a39)
- add deduplicated job id to the deduplicated event (0f21c10)
- updateProgress: allow more types to be used as progress (#3187) (f16b748)
Performance Improvements
- worker: optimize job retrieval for failed jobs in chunks (#3127) (e0f02ce)
- flow: validate parentKey existence before trying to move it to failed (#3163) (5a88e47)
[7.32.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.32.1...v7.32.2) (2025-03-15)
Bug Fixes
[7.32.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.32.0...v7.32.1) (2025-03-11)
Bug Fixes
[7.32.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.31.1...v7.32.0) (2025-03-05)
Features
[7.31.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.31.0...v7.31.1) (2025-03-04)
Bug Fixes
- scheduler: validate repeatKey if present when cleaning failed jobs (#3115) fixes #3114 (d4cad84)
- flow: consider delayed state when moving a parent to failed (#3112) (6a28b86)
- telemetry: fix span name for moveToFailed logic (#3113) (7a4b500)
[7.31.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.4...v7.31.0) (2025-03-02)
Bug Fixes
- batch: remove debug statement (6620f82)
Features
- batches: add initial support for minSize (48d1e01)
- batches: add timeout option for minSize (2c40aff)
[7.30.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.3...v7.30.4) (2025-03-01)
Bug Fixes
Performance Improvements
[7.30.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.2...v7.30.3) (2025-02-21)
Bug Fixes
- repeat: use JobPro class when creating delayed job (#292) (ce9eff8)
- worker: do not execute run method when no processor is defined when resuming (#3089) (4a66933)
- worker: do not resume when closing (#3080) (024ee0f)
- job: set processedBy when moving job to active in moveToFinished (#3077) fixes #3073 (1aa970c)
- drain: pass delayed key for redis cluster (#3074) (05ea32b)
- job-scheduler: restore limit option to be saved (#3071) (3e649f7)
- job-scheduler: return undefined in getJobScheduler when it does not exist (#3065) fixes #3062 (548cc1c)
- fix return type of getNextJob (b970281)
Features
- job: add moveToWait method for manual processing (#2978) (5a97491)
- queue: support removeGlobalConcurrency method (#3076) (ece8532)
Performance Improvements
[7.30.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.1...v7.30.2) (2025-02-20)
Bug Fixes
[7.30.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.0...v7.30.1) (2025-02-20)
Bug Fixes
[7.30.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.29.0...v7.30.0) (2025-02-19)
Features
[7.29.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.28.0...v7.29.0) (2025-02-18)
Features
- job-scheduler: revert add delayed job and update in the same script (9f0f1ba)
[7.28.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.27.0...v7.28.0) (2025-02-15)
Bug Fixes
- worker: evaluate if a job needs to be fetched when moving to failed (#3043) (406e21c)
- retry-job: consider updating failures in job (#3036) (21e8495)
- flow-producer: add support for skipWaitingForReady (6d829fc)
Features
- job-scheduler: save limit option (#3033) (a1571ea)
- queue: add option to skip wait until connection ready (e728299)
[7.27.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.6...v7.27.0) (2025-02-12)
Bug Fixes
- worker: avoid possible hazard in closing worker (0f07467)
Features
- queue-getters: add prometheus exporter (078ae9d)
- job-scheduler: save iteration count (#3018) (ad5c07c)
- sandbox: add support for getChildrenValues (dcc3b06)
[7.26.6](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.5...v7.26.6) (2025-02-03)
Bug Fixes
[7.26.5](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.4...v7.26.5) (2025-02-02)
Bug Fixes
- worker: remove the use of multi in extend locks (3862075)
[7.26.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.3...v7.26.4) (2025-01-30)
Bug Fixes
[7.26.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.2...v7.26.3) (2025-01-26)
Bug Fixes
[7.26.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.1...v7.26.2) (2025-01-18)
Bug Fixes
- job-scheduler: use delayed job data when template data is not present (#3010) fixes #3009 (95edb40)
- job-scheduler: add next delayed job only when prevMillis matches with producerId (#3001) (4ea35dd)
- job-scheduler: avoid duplicates when upserting in a quick sequence (#2991) (e8cdb99)
- dynamic-rate-limit: validate job lock cases (#2975) (8bb27ea)
Performance Improvements
- job-scheduler: add delayed job and update scheduler in same script (#2997) (9be28a0)
- job-scheduler: add delayed job and scheduler in same script (#2993) (95718e8)
[7.26.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.0...v7.26.1) (2024-12-22)
Bug Fixes
- sandbox: fix issue where job could stay in active forever (#2979) (c0a6bcd)
- sandboxed: fix detecting special errors by sending default messages (#2967) fixes #2962 (52b0e34)
[7.26.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.25.0...v7.26.0) (2024-12-17)
Bug Fixes
- scripts: make sure jobs fields are not empty before unpack (4360572)
- guarantee every repeatable jobs are slotted (9917df1)
- job-scheduler: avoid duplicated delayed jobs when repeatable jobs are retried (af75315)
- job-scheduler: omit deduplication and debounce options from template options (#2960) (b5fa6a3)
Features
- telemetry: add option to omit context propagation on jobs (#2946) (6514c33)
- replace multi by lua scripts in moveToFailed (#2958) (c19c914)
[7.25.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.24.0...v7.25.0) (2024-12-17)
Features
[7.24.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.23.1...v7.24.0) (2024-12-07)
Bug Fixes
- worker: catch connection error when moveToActive is called (#2952) (544fc7c)
- scheduler-template: remove console.log when getting template information (#2950) (3402bfe)
- flow: allow using removeOnFail and failParentOnFailure in parents (#2947) fixes #2229 (85f6f6f)
- job-scheduler: upsert template when same pattern options are provided (#2943) ref #2940 (b56c3b4)
Features
- queue: enhance getJobScheduler method to include template information (#2929) ref #2875 (cb99080)
- queue: add getJobSchedulersCount method (#2945) (38820dc)
[7.23.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.23.0...v7.23.1) (2024-12-06)
Bug Fixes
[7.23.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.22.0...v7.23.0) (2024-11-26)
Bug Fixes
Features
- telemetry: add telemetry support (#273) (e5cc134)
- queue: refactor a protected addJob method allowing telemetry extensions (09f2571)
[7.22.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.21.1...v7.22.0) (2024-11-22)
Bug Fixes
- queue: change _jobScheduler from private to protected for extension (#2920) (34c2348)
- scheduler: use Job class from getter for extension (#2917) (5fbb075)
- telemetry: do not set span on parent context if undefined (c417a23)
Features
- job-scheduler: add telemetry support to the job scheduler (72ea950)
- queue: add rateLimit method (#2896) (db84ad5)
- queue: add removeRateLimitKey method (#2806) (ff70613)
Performance Improvements
[7.21.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.21.0...v7.21.1) (2024-11-15)
Bug Fixes
[7.21.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.20.2...v7.21.0) (2024-11-14)
Bug Fixes
- queue: fix generics to be able to properly be extended (f2495e5)
Features
- queue-pro: expose jobs pro in getters (e1da097)
- improve queue getters to use generic job type (#2905) (c9531ec)
[7.20.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.20.1...v7.20.2) (2024-11-13)
Bug Fixes
- job-scheculer: avoid hazards when upserting job schedulers concurrently (022f7b7)
- connection: do not allow to set blockingConnection option (#2851) (9391cc2)
[7.20.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.20.0...v7.20.1) (2024-11-10)
Bug Fixes
- repeatable: only apply immediately in the first iteration (f69cfbc)
[7.20.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.19.0...v7.20.0) (2024-11-09)
Bug Fixes
- scripts: set package version by default for extension (#2887) (b955340)
- worker: allow retrieving concurrency value (#2883) fixes #2880 (52f6317)
- connection: set packageVersion as protected attribute for extension (#2884) (411ccae)
Features
- queue-events: add QueueEventsProducer for publishing custom events (#2844) (5eb03cd)
- flows: add telemetry support (#2879) (5ed154b)
[7.19.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.18.0...v7.19.0) (2024-11-08)
Bug Fixes
Features
- scheduler: add getJobScheduler method (#2877) ref #2875 (956d98c)
- queue: add a telemetry interface (#2721) (273b574)
[7.18.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.17.2...v7.18.0) (2024-11-07)
Bug Fixes
- proper way to get version (b4e25c1)
- scripts: add missing wait in isJobInList (9ef865c)
- redis: use version for naming loaded lua scripts (fe73f6d)
Features
[7.17.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.17.1...v7.17.2) (2024-10-23)
Bug Fixes
- sandbox: fix serialization of error with circular references are present (#2815) fix #2813 (a384d92)
[7.17.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.17.0...v7.17.1) (2024-10-18)
Bug Fixes
[7.17.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.16.0...v7.17.0) (2024-10-12)
Bug Fixes
- repeat: also consider startDate when using "every" (25bbaa8)
- sandbox: catch exit errors (#2800) (6babb9e)
Features
- repeat: deprecate immediately on job scheduler (ed047f7)
- job: expose priority value (#2804) (9abec3d)
- job: add deduplication logic (#2796) (0a4982d)
- queue: add new upsertJobScheduler, getJobSchedulers and removeJobSchedulers methods (dd6b6b2)
- worker-fork: allow passing fork options (#2795) (f7a4292)
- worker-thread: allow passing Worker options (#2791) ref #1555 (6a1f7a9)
[7.16.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.15.4...v7.16.0) (2024-09-24)
Bug Fixes
- repeatable: avoid delayed job deletion if next job already existed (#2778) (6a851c1)
- connection: allow passing connection string into IORedis (#2746) (73005e8)
- metrics: differentiate points in different minutes to be more accurate (#2766) (python) (7cb670e)
- pattern: do not save offset when immediately is provided (#2756) (a8cb8a2)
Features
- groups: support changing priority intra groups (#255) (2b0bf7e)
- queue: add getDebounceJobId method (#2717) (a68ead9)
Performance Improvements
[7.15.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.15.3...v7.15.4) (2024-09-21)
Bug Fixes
- repeat: replace delayed job when updating repeat key (88029bb)
[7.15.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.15.2...v7.15.3) (2024-09-07)
Bug Fixes
- flows: throw error when queueName contains colon (#2719) fixes #2718 (9ef97c3)
- sandboxed: properly update data on wrapped job (#2739) fixes #2731 (9c4b245)
[7.15.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.15.1...v7.15.2) (2024-09-07)
Bug Fixes
- flow: remove debounce key when parent is moved to fail (#2720) (d51aabe)
- flow: recursive ignoreDependencyOnFailure option (#2712) (53bc9eb)
- job: throw error if removeDependencyOnFailure and ignoreDependencyOnFailure are used together (#2711) (967632c)
- job: change moveToFinished return type to reflect jobData (#2706) ref #2342 (de094a3)
- stalled: support removeDependencyOnFailure option when job is stalled (#2708) (e0d3790)
Performance Improvements
[7.15.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.15.0...v7.15.1) (2024-09-06)
Bug Fixes
- worker: fix close sequence to reduce risk for open handlers (#2656) (8468e44)
- flow: validate parentData before ignoreDependencyOnFailure when stalled check happens (#2702) (python) (9416501)
[7.15.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.14.1...v7.15.0) (2024-09-05)
Bug Fixes
Features
Performance Improvements
[7.14.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.14.0...v7.14.1) (2024-08-09)
Bug Fixes
[7.14.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.13.0...v7.14.0) (2024-08-08)
Features
- queue-events: pass debounceId as a param of debounced event (#2678) (97fb97a)
- job: allow passing debounce as option (#2666) (163ccea)
[7.13.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.12.0...v7.13.0) (2024-07-31)
Bug Fixes
- repeatable: remove repeat hash when removing repeatable job (#2676) (97a297d)
- repeatable: keep legacy repeatables if it exists instead of creating one with new structure (#2665) (93fad41)
- repeatable: consider removing legacy repeatable job (#2658) fixes #2661 (a6764ae)
- repeatable: pass custom key as an args in addRepeatableJob to prevent CROSSSLOT issue (#2662) fixes #2660 (9d8f874)
Features
Performance Improvements
[7.12.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.11.0...v7.12.0) (2024-07-26)
Features
[7.11.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.10.1...v7.11.0) (2024-07-14)
Features
[7.10.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.10.0...v7.10.1) (2024-07-09)
Bug Fixes
[7.10.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.9.2...v7.10.0) (2024-07-06)
Bug Fixes
- queue-getters: consider passing maxJobs when calling getRateLimitTtl (#2631) fixes #2628 (9f6609a)
- job: consider changing priority to 0 (#2599) (4dba122)
- priority: consider paused state when calling getCountsPerPriority (python) (#2609) (6e99250)
- priority: use module instead of bit.band to keep order (python) (#2597) (9ece15b)
Features
Performance Improvements
[7.9.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.9.1...v7.9.2) (2024-06-28)
Bug Fixes
[7.9.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.9.0...v7.9.1) (2024-06-18)
Bug Fixes
[7.9.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.8.3...v7.9.0) (2024-06-15)
Features
[7.8.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.8.2...v7.8.3) (2024-06-13)
Bug Fixes
[7.8.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.8.1...v7.8.2) (2024-05-31)
Bug Fixes
- worker: properly cancel blocking command during disconnections (2cf12b3)
- extendlock,createbulk use pipeline no multi command (a053d9b)
- repeat: throw error when endDate is pointing to the past (#2574) (5bd7990)
- retry-job: throw error when job is not in active state (#2576) (ca207f5)
- sandboxed: ensure DelayedError is checked in Sandboxed processors (#2567) fixes #2566 (8158fa1)
- job: validate job existence when adding a log (#2562) (f87e3fe)
[7.8.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.8.0...v7.8.1) (2024-05-18)
Bug Fixes
[7.8.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.7.2...v7.8.0) (2024-05-10)
Features
[7.7.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.7.1...v7.7.2) (2024-05-04)
Bug Fixes
- worker: make sure clearTimeout is always called after bzpopmin (782382e)
- worker: force timeout on bzpopmin command (#2543) (ae7cb6c)
Performance Improvements
[7.7.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.7.0...v7.7.1) (2024-04-30)
Bug Fixes
- worker-pro: correct typo in options argument for limiter (0e999dd)
[7.7.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.6.2...v7.7.0) (2024-04-30)
Features
[7.6.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.6.1...v7.6.2) (2024-04-25)
Bug Fixes
[7.6.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.6.0...v7.6.1) (2024-04-23)
Bug Fixes
- worker: return minimumBlockTimeout depending on redis version (python) (#2532) (83dfb63)
- stalled: consider failParentOnFailure when moving child into failed (#2526) fixes #2464 (python) (5e31eb0)
Performance Improvements
[7.6.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.5.0...v7.6.0) (2024-04-17)
Features
[7.5.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.4.1...v7.5.0) (2024-04-10)
Bug Fixes
- worker: use 0.002 as minimum timeout for redis version lower than 7.0.8 (#2515) fixes #2466 (44f7d21)
Features
- allow arbitrary large drainDelay (9693321)
Performance Improvements
- stalled: remove jobId from stalled after removing lock when moved from active (#2512) (python) (64feec9)
- add-to-group: skip reinsertion of group (#215) (6823251)
[7.4.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.4.0...v7.4.1) (2024-04-07)
Bug Fixes
[7.4.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.3.1...v7.4.0) (2024-04-04)
Bug Fixes
- connection: ignore error when setting custom end status (#2473) (3e17e45)
- job: stack trace limit (#2487) (cce3bc3)
- scripts: use command name in error message when moving to finished (#2483) (3c335d4)
- queue: use QueueOptions type in opts attribute (#2481) (51a589f)
- worker: validate drainDelay must be greater than 0 (#2477) (ab43693)
Features
- getters: add getWorkersCount (743c7aa)
[7.3.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.3.0...v7.3.1) (2024-03-30)
Bug Fixes
[7.3.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.2.0...v7.3.0) (2024-03-16)
Bug Fixes
- deps: move fast-glob and minimatch as dev-dependencies (#2452) (cf13b31)
- worker: set blockTimeout as 0.001 when reach the time to get delayed jobs (#2455) fixes #2450 (2de15ca)
Features
[7.2.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.1.0...v7.2.0) (2024-03-15)
Bug Fixes
- deps: replaced glob by fast-glob due to security advisory (91cf9a9)
- sandbox: extend SandboxedJob from JobJsonSandbox (#2446) fixes #2439 (7606e36)
- add-job: fix parent job cannot be replaced error message (#2441) (1e9a13f)
Features
- worker: add support for naming workers (7ba2729)
[7.1.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.0.0...v7.1.0) (2024-03-14)
Bug Fixes
- flow: remove failed children references on auto removal (#2432) (8a85207)
- redis-connection: close redis connection even when initializing (#2425) fixes #2385 (1bc26a6)
Features
[7.0.0](https://github.com/taskforcesh/bullmq-pro/compare/v6.11.0...v7.0.0) (2024-03-12)
Bug Fixes
- worker: update processor types (#193) (8ebb72e)
- flow: parent job cannot be replaced (python) (#2417) (2696ef8)
- reprocess-job: add marker if needed (#2406) (5923ed8)
- rate-limit: move job to wait even if ttl is 0 (#2403) (c1c2ccc)
- stalled: consider adding marker when moving job back to wait (#2384) (4914df8)
- retry-jobs: add marker when needed (#2374) (1813d5f)
- security: upgrade msgpackr https://github.com/advisories/GHSA-7hpj-7hhx-2fgx (7ae0953)
- worker: worker can be closed if Redis is down (#2350) (888dcc2)
- worker: throw error if connection is missing (6491a18)
Features
- stalled: add command to repair stalled key (#193) (8ebb72e)
- repeatable: allow saving custom key (#1824) (8ea0e1f)
- job: provide skipAttempt option when manually moving a job (#2203) (0e88e4f)
- worker: improved markers handling (73cf5fc) (0bac0fb)
Performance Improvements
- marker: differentiate standard and delayed markers (python) (#2389) (18ebee8)
- change-delay: add delay marker when needed (#2411) (8b62d28)
- flow: add marker when moving parent to wait (python) (#2408) (6fb6896)
- move-to-active: check rate limited once (#2391) (ca6c17a)
BREAKING CHANGES
connection: require connection to be passed (#2335) (1867dd1)
job: revert console warn custom job ids when they represent integers (#2312) (84015ff)
worker: markers use now a dedicated key in redis instead of using a special Job ID.
stalled: remove type check in stalled key
references:
Gitbook Bullmq Pro Install (`docs/gitbook/bullmq-pro/install.md`)
Install
In order to install BullMQ Pro you need to use a NPM token from taskforce.sh.
With the token at hand just update or create a .npmrc file in your app repository with the following contents:
@taskforcesh:registry=https://npm.taskforce.sh/
//npm.taskforce.sh/:_authToken=${NPM_TASKFORCESH_TOKEN}
always-auth=truewhere NPM_TASKFORCESH_TOKEN is an environment variable pointing to your token.
Then just install the @taskforcesh/bullmq-pro package as you would install any other package, with npm, yarn or pnpm:
yarn add @taskforcesh/bullmq-proIn order to use BullMQ Pro just import the Pro versions of the classes. These classes are subclasses of the open source BullMQ library with new functionality:
import { QueuePro, WorkerPro } from '@taskforcesh/bullmq-pro';
const queue = new QueuePro('myQueue');
const worker = new WorkerPro('myQueue', async job => {
// Process job
});Using Docker
If you use docker you must make sure that you also add the .npmrc file above in your Dockerfile:
WORKDIR /app
ADD .npmrc /app/.npmrcGitbook Bullmq Pro Introduction (`docs/gitbook/bullmq-pro/introduction.md`)
Introduction
BullMQ Pro, the commercial version of BullMQ, boasts advanced features and offers dedicated support from the library's authors. You can easily install this package as a drop-in replacement for the standard BullMQ to access these new features.
The BullMQ Pro version continues to evolve, with more features being added regularly. You can check the roadmap section to gain insight into what to expect in the forthcoming months.
(1).png>)
Commercial License
BullMQ Pro uses a per-organization licensing model, allowing unlimited use across all your projects. You can request a free trial token on this page, allowing you to evaluate its value. If you find it beneficial, consider subscribing under the 'Subscriptions' tab.
Gitbook Bullmq Pro New Releases (`docs/gitbook/bullmq-pro/new-releases.md`)
New Releases
If you want to get notifications when we do a new release of BullMQ Pro, please enable notifications on this Github issue where we automatically create a new comment for every new release:
https://github.com/taskforcesh/bullmq-pro-support/issues/86
Gitbook Bullmq Pro Support (`docs/gitbook/bullmq-pro/support.md`)
Support
With your BullMQ Pro subscription, you receive commercial support. For the most recent and detailed terms, please refer to the "BullMQ Pro" tab in your account. Here's a broad overview of what's included:
- Email-based support: Customers may submit issues or queries via email to our dedicated support email address ([email protected]).
- Response time: We aim to respond to support emails within one business day (business days are defined in section 4). However, response times may vary, and quicker responses may occur on a best-effort basis.
- Resolution time: The time it takes to resolve an issue depends on the nature of the issue. Simple queries or requests for advice may be resolved quickly. More complex issues, such as bugs, may take several days or more to resolve. In some cases, we may not be able to fully resolve an issue but will provide a workaround.
Gitbook Bullmq Pro Telemetry (`docs/gitbook/bullmq-pro/telemetry.md`)
Telemetry
In the same fashion we support telemetry in BullMQ open source edition, we also support telemetry for BullMQ Pro. It works basically the same, in fact you can just the same integrations available for BullMQ in the Pro version. So in order to enable it you would do something like this:
import { QueuePro } from '@taskforcesh/bullmq-pro';
import { BullMQOtel } from 'bullmq-otel';
// Initialize a Pro queue using BullMQ-Otel
const queue = new QueuePro('myProQueue', {
connection,
telemetry: new BullMQOtel('guide'),
});
await queue.add(
'myJob',
{ data: 'myData' },
{
attempts: 2,
backoff: 1000,
group: {
id: 'myGroupId',
},
},
);For the Worker we will do it in a similar way:
import { WorkerPro } from '@taskforcesh/bullmq-pro';
import { BullMQOtel } from 'bullmq-otel';
const worker = new WorkerPro(
'myProQueue',
async job => {
console.log('processing job', job.id);
},
{
name: 'myWorker',
connection,
telemetry: new BullMQOtel('guide'),
concurrency: 10,
batch: { size: 10 },
},
);For an introductury guide on how to integrate OpenTelemetry in you BullMQ applications take a look at this tutorial: https://blog.taskforce.sh/how-to-integrate-bullmqs-telemetry-on-a-newsletters-subscription-application-2/
Gitbook Changelogs Changelog V1 (`docs/gitbook/changelogs/changelog-v1.md`)
[1.91.1](https://github.com/taskforcesh/bullmq/compare/v1.91.0...v1.91.1) (2022-09-18)
Bug Fixes
[1.91.0](https://github.com/taskforcesh/bullmq/compare/v1.90.2...v1.91.0) (2022-09-16)
Features
[1.90.2](https://github.com/taskforcesh/bullmq/compare/v1.90.1...v1.90.2) (2022-09-12)
Performance Improvements
[1.90.1](https://github.com/taskforcesh/bullmq/compare/v1.90.0...v1.90.1) (2022-09-02)
Performance Improvements
[1.90.0](https://github.com/taskforcesh/bullmq/compare/v1.89.2...v1.90.0) (2022-08-30)
Features
[1.89.2](https://github.com/taskforcesh/bullmq/compare/v1.89.1...v1.89.2) (2022-08-23)
Bug Fixes
[1.89.1](https://github.com/taskforcesh/bullmq/compare/v1.89.0...v1.89.1) (2022-08-19)
Bug Fixes
[1.89.0](https://github.com/taskforcesh/bullmq/compare/v1.88.2...v1.89.0) (2022-08-18)
Features
[1.88.2](https://github.com/taskforcesh/bullmq/compare/v1.88.1...v1.88.2) (2022-08-18)
Bug Fixes
[1.88.1](https://github.com/taskforcesh/bullmq/compare/v1.88.0...v1.88.1) (2022-08-17)
Bug Fixes
- fix husky install (edee918)
[1.88.0](https://github.com/taskforcesh/bullmq/compare/v1.87.2...v1.88.0) (2022-08-17)
Bug Fixes
- clean: consider priority when cleaning waiting jobs (#1357) (ced5be1)
- parent-priority-check: use tonumber on priority (#1370) (e2043c6)
Features
- sandbox: experimental support ESM (ed0faff)
[1.87.2](https://github.com/taskforcesh/bullmq/compare/v1.87.1...v1.87.2) (2022-08-13)
Bug Fixes
[1.87.1](https://github.com/taskforcesh/bullmq/compare/v1.87.0...v1.87.1) (2022-08-09)
Bug Fixes
[1.87.0](https://github.com/taskforcesh/bullmq/compare/v1.86.10...v1.87.0) (2022-08-05)
Features
[1.86.10](https://github.com/taskforcesh/bullmq/compare/v1.86.9...v1.86.10) (2022-07-29)
Performance Improvements
[1.86.9](https://github.com/taskforcesh/bullmq/compare/v1.86.8...v1.86.9) (2022-07-27)
Bug Fixes
[1.86.8](https://github.com/taskforcesh/bullmq/compare/v1.86.7...v1.86.8) (2022-07-26)
Bug Fixes
[1.86.7](https://github.com/taskforcesh/bullmq/compare/v1.86.6...v1.86.7) (2022-07-15)
Bug Fixes
[1.86.6](https://github.com/taskforcesh/bullmq/compare/v1.86.5...v1.86.6) (2022-07-14)
Bug Fixes
[1.86.5](https://github.com/taskforcesh/bullmq/compare/v1.86.4...v1.86.5) (2022-07-09)
Bug Fixes
[1.86.4](https://github.com/taskforcesh/bullmq/compare/v1.86.3...v1.86.4) (2022-06-29)
Bug Fixes
[1.86.3](https://github.com/taskforcesh/bullmq/compare/v1.86.2...v1.86.3) (2022-06-26)
Bug Fixes
[1.86.2](https://github.com/taskforcesh/bullmq/compare/v1.86.1...v1.86.2) (2022-06-16)
Bug Fixes
[1.86.1](https://github.com/taskforcesh/bullmq/compare/v1.86.0...v1.86.1) (2022-06-12)
Bug Fixes
- unpack empty metrics in batches (96829db)
[1.86.0](https://github.com/taskforcesh/bullmq/compare/v1.85.4...v1.86.0) (2022-06-10)
Features
[1.85.4](https://github.com/taskforcesh/bullmq/compare/v1.85.3...v1.85.4) (2022-06-08)
Bug Fixes
[1.85.3](https://github.com/taskforcesh/bullmq/compare/v1.85.2...v1.85.3) (2022-06-03)
Bug Fixes
[1.85.2](https://github.com/taskforcesh/bullmq/compare/v1.85.1...v1.85.2) (2022-06-01)
Bug Fixes
[1.85.1](https://github.com/taskforcesh/bullmq/compare/v1.85.0...v1.85.1) (2022-05-31)
Performance Improvements
[1.85.0](https://github.com/taskforcesh/bullmq/compare/v1.84.1...v1.85.0) (2022-05-30)
Features
[1.84.1](https://github.com/taskforcesh/bullmq/compare/v1.84.0...v1.84.1) (2022-05-27)
Bug Fixes
[1.84.0](https://github.com/taskforcesh/bullmq/compare/v1.83.2...v1.84.0) (2022-05-26)
Features
[1.83.2](https://github.com/taskforcesh/bullmq/compare/v1.83.1...v1.83.2) (2022-05-24)
Bug Fixes
[1.83.1](https://github.com/taskforcesh/bullmq/compare/v1.83.0...v1.83.1) (2022-05-24)
Bug Fixes
[1.83.0](https://github.com/taskforcesh/bullmq/compare/v1.82.3...v1.83.0) (2022-05-20)
Features
[1.82.3](https://github.com/taskforcesh/bullmq/compare/v1.82.2...v1.82.3) (2022-05-19)
Bug Fixes
- redis-connection: save cluster opts and coerse redis version (#1247) ref #1246 fixes #1243 (acb69b5)
[1.82.2](https://github.com/taskforcesh/bullmq/compare/v1.82.1...v1.82.2) (2022-05-17)
Bug Fixes
[1.82.1](https://github.com/taskforcesh/bullmq/compare/v1.82.0...v1.82.1) (2022-05-16)
Bug Fixes
[1.82.0](https://github.com/taskforcesh/bullmq/compare/v1.81.4...v1.82.0) (2022-05-11)
Features
[1.81.4](https://github.com/taskforcesh/bullmq/compare/v1.81.3...v1.81.4) (2022-05-05)
Bug Fixes
[1.81.3](https://github.com/taskforcesh/bullmq/compare/v1.81.2...v1.81.3) (2022-05-04)
Bug Fixes
[1.81.2](https://github.com/taskforcesh/bullmq/compare/v1.81.1...v1.81.2) (2022-05-03)
Bug Fixes
[1.81.1](https://github.com/taskforcesh/bullmq/compare/v1.81.0...v1.81.1) (2022-04-29)
Bug Fixes
[1.81.0](https://github.com/taskforcesh/bullmq/compare/v1.80.6...v1.81.0) (2022-04-26)
Features
[1.80.6](https://github.com/taskforcesh/bullmq/compare/v1.80.5...v1.80.6) (2022-04-22)
Bug Fixes
[1.80.5](https://github.com/taskforcesh/bullmq/compare/v1.80.4...v1.80.5) (2022-04-21)
Bug Fixes
[1.80.4](https://github.com/taskforcesh/bullmq/compare/v1.80.3...v1.80.4) (2022-04-19)
Bug Fixes
[1.80.3](https://github.com/taskforcesh/bullmq/compare/v1.80.2...v1.80.3) (2022-04-15)
Bug Fixes
[1.80.2](https://github.com/taskforcesh/bullmq/compare/v1.80.1...v1.80.2) (2022-04-15)
Bug Fixes
[1.80.1](https://github.com/taskforcesh/bullmq/compare/v1.80.0...v1.80.1) (2022-04-14)
Bug Fixes
[1.80.0](https://github.com/taskforcesh/bullmq/compare/v1.79.1...v1.80.0) (2022-04-12)
Features
[1.79.1](https://github.com/taskforcesh/bullmq/compare/v1.79.0...v1.79.1) (2022-04-12)
Bug Fixes
[1.79.0](https://github.com/taskforcesh/bullmq/compare/v1.78.2...v1.79.0) (2022-04-08)
Features
[1.78.2](https://github.com/taskforcesh/bullmq/compare/v1.78.1...v1.78.2) (2022-03-31)
Bug Fixes
[1.78.1](https://github.com/taskforcesh/bullmq/compare/v1.78.0...v1.78.1) (2022-03-24)
Bug Fixes
[1.78.0](https://github.com/taskforcesh/bullmq/compare/v1.77.3...v1.78.0) (2022-03-23)
Features
[1.77.3](https://github.com/taskforcesh/bullmq/compare/v1.77.2...v1.77.3) (2022-03-22)
Bug Fixes
[1.77.2](https://github.com/taskforcesh/bullmq/compare/v1.77.1...v1.77.2) (2022-03-20)
Bug Fixes
Performance Improvements
[1.77.1](https://github.com/taskforcesh/bullmq/compare/v1.77.0...v1.77.1) (2022-03-17)
Bug Fixes
[1.77.0](https://github.com/taskforcesh/bullmq/compare/v1.76.6...v1.77.0) (2022-03-16)
Features
- allow QueueScheduler to be extended (289beb8)
[1.76.6](https://github.com/taskforcesh/bullmq/compare/v1.76.5...v1.76.6) (2022-03-15)
Bug Fixes
[1.76.5](https://github.com/taskforcesh/bullmq/compare/v1.76.4...v1.76.5) (2022-03-15)
Bug Fixes
[1.76.4](https://github.com/taskforcesh/bullmq/compare/v1.76.3...v1.76.4) (2022-03-13)
Performance Improvements
[1.76.3](https://github.com/taskforcesh/bullmq/compare/v1.76.2...v1.76.3) (2022-03-10)
Bug Fixes
- drained: emit event only once when queue has drained the waiting list (#1123) fixes #1121 ref #1070 (b89b4e8)
[1.76.2](https://github.com/taskforcesh/bullmq/compare/v1.76.1...v1.76.2) (2022-03-09)
Bug Fixes
[1.76.1](https://github.com/taskforcesh/bullmq/compare/v1.76.0...v1.76.1) (2022-03-04)
Bug Fixes
[1.76.0](https://github.com/taskforcesh/bullmq/compare/v1.75.1...v1.76.0) (2022-03-02)
Features
- metrics: add metrics support (ab51326)
[1.75.1](https://github.com/taskforcesh/bullmq/compare/v1.75.0...v1.75.1) (2022-02-26)
Bug Fixes
[1.75.0](https://github.com/taskforcesh/bullmq/compare/v1.74.3...v1.75.0) (2022-02-24)
Bug Fixes
Features
[1.74.3](https://github.com/taskforcesh/bullmq/compare/v1.74.2...v1.74.3) (2022-02-24)
Bug Fixes
[1.74.2](https://github.com/taskforcesh/bullmq/compare/v1.74.1...v1.74.2) (2022-02-23)
Bug Fixes
[1.74.1](https://github.com/taskforcesh/bullmq/compare/v1.74.0...v1.74.1) (2022-02-20)
Bug Fixes
[1.74.0](https://github.com/taskforcesh/bullmq/compare/v1.73.0...v1.74.0) (2022-02-19)
Features
[1.73.0](https://github.com/taskforcesh/bullmq/compare/v1.72.0...v1.73.0) (2022-02-16)
Features
- job: add prefix getter (#1077) (db9ef10)
- queue-getters: add getQueueSchedulers (#1078) ref #1075 (0b3b1c4)
[1.72.0](https://github.com/taskforcesh/bullmq/compare/v1.71.0...v1.72.0) (2022-02-15)
Features
[1.71.0](https://github.com/taskforcesh/bullmq/compare/v1.70.0...v1.71.0) (2022-02-14)
Features
[1.70.0](https://github.com/taskforcesh/bullmq/compare/v1.69.1...v1.70.0) (2022-02-11)
Features
[1.69.1](https://github.com/taskforcesh/bullmq/compare/v1.69.0...v1.69.1) (2022-02-10)
Bug Fixes
[1.69.0](https://github.com/taskforcesh/bullmq/compare/v1.68.4...v1.69.0) (2022-02-08)
Features
[1.68.4](https://github.com/taskforcesh/bullmq/compare/v1.68.3...v1.68.4) (2022-02-05)
Bug Fixes
[1.68.3](https://github.com/taskforcesh/bullmq/compare/v1.68.2...v1.68.3) (2022-02-04)
Bug Fixes
[1.68.2](https://github.com/taskforcesh/bullmq/compare/v1.68.1...v1.68.2) (2022-02-03)
Performance Improvements
[1.68.1](https://github.com/taskforcesh/bullmq/compare/v1.68.0...v1.68.1) (2022-02-01)
Bug Fixes
[1.68.0](https://github.com/taskforcesh/bullmq/compare/v1.67.3...v1.68.0) (2022-01-29)
Features
Performance Improvements
[1.67.3](https://github.com/taskforcesh/bullmq/compare/v1.67.2...v1.67.3) (2022-01-28)
Bug Fixes
[1.67.2](https://github.com/taskforcesh/bullmq/compare/v1.67.1...v1.67.2) (2022-01-28)
Bug Fixes
[1.67.1](https://github.com/taskforcesh/bullmq/compare/v1.67.0...v1.67.1) (2022-01-27)
Bug Fixes
Performance Improvements
[1.67.0](https://github.com/taskforcesh/bullmq/compare/v1.66.1...v1.67.0) (2022-01-26)
Features
- add support for removeOn based on time (6c4ac75)
[1.66.1](https://github.com/taskforcesh/bullmq/compare/v1.66.0...v1.66.1) (2022-01-25)
Bug Fixes
[1.66.0](https://github.com/taskforcesh/bullmq/compare/v1.65.1...v1.66.0) (2022-01-23)
Features
[1.65.1](https://github.com/taskforcesh/bullmq/compare/v1.65.0...v1.65.1) (2022-01-21)
Bug Fixes
[1.65.0](https://github.com/taskforcesh/bullmq/compare/v1.64.4...v1.65.0) (2022-01-21)
Features
[1.64.4](https://github.com/taskforcesh/bullmq/compare/v1.64.3...v1.64.4) (2022-01-19)
Bug Fixes
[1.64.3](https://github.com/taskforcesh/bullmq/compare/v1.64.2...v1.64.3) (2022-01-17)
Bug Fixes
- worker: blockTime must be integer on older Redis (6fedc0a)
[1.64.2](https://github.com/taskforcesh/bullmq/compare/v1.64.1...v1.64.2) (2022-01-14)
Bug Fixes
[1.64.1](https://github.com/taskforcesh/bullmq/compare/v1.64.0...v1.64.1) (2022-01-14)
Bug Fixes
- sandbox: exit uncaughtException instead of throwing error (013d6a5)
[1.64.0](https://github.com/taskforcesh/bullmq/compare/v1.63.3...v1.64.0) (2022-01-07)
Features
[1.63.3](https://github.com/taskforcesh/bullmq/compare/v1.63.2...v1.63.3) (2022-01-06)
Bug Fixes
[1.63.2](https://github.com/taskforcesh/bullmq/compare/v1.63.1...v1.63.2) (2022-01-04)
Bug Fixes
[1.63.1](https://github.com/taskforcesh/bullmq/compare/v1.63.0...v1.63.1) (2022-01-04)
Bug Fixes
[1.63.0](https://github.com/taskforcesh/bullmq/compare/v1.62.0...v1.63.0) (2021-12-31)
Features
[1.62.0](https://github.com/taskforcesh/bullmq/compare/v1.61.0...v1.62.0) (2021-12-31)
Bug Fixes
Features
[1.61.0](https://github.com/taskforcesh/bullmq/compare/v1.60.0...v1.61.0) (2021-12-29)
Features
[1.60.0](https://github.com/taskforcesh/bullmq/compare/v1.59.4...v1.60.0) (2021-12-29)
Features
[1.59.4](https://github.com/taskforcesh/bullmq/compare/v1.59.3...v1.59.4) (2021-12-21)
Bug Fixes
[1.59.3](https://github.com/taskforcesh/bullmq/compare/v1.59.2...v1.59.3) (2021-12-21)
Bug Fixes
- worker: fix undefined moveToActive (87e8cab)
[1.59.2](https://github.com/taskforcesh/bullmq/compare/v1.59.1...v1.59.2) (2021-12-17)
Bug Fixes
[1.59.1](https://github.com/taskforcesh/bullmq/compare/v1.59.0...v1.59.1) (2021-12-17)
Bug Fixes
- copy lua files to correct location (2be1120)
[1.59.0](https://github.com/taskforcesh/bullmq/compare/v1.58.0...v1.59.0) (2021-12-17)
Bug Fixes
- correct dist path (067d4c2)
Features
- also export bullmq as an ESM (e97e5b5)
[1.58.0](https://github.com/taskforcesh/bullmq/compare/v1.57.4...v1.58.0) (2021-12-15)
Features
[1.57.4](https://github.com/taskforcesh/bullmq/compare/v1.57.3...v1.57.4) (2021-12-14)
Bug Fixes
- move-to-active: add try catch in moveToActive call (#933) (bab45b0)
- redis-connection: consider cluster redisOptions config (#934) (5130f63)
[1.57.3](https://github.com/taskforcesh/bullmq/compare/v1.57.2...v1.57.3) (2021-12-14)
Bug Fixes
[1.57.2](https://github.com/taskforcesh/bullmq/compare/v1.57.1...v1.57.2) (2021-12-11)
Bug Fixes
Performance Improvements
[1.57.1](https://github.com/taskforcesh/bullmq/compare/v1.57.0...v1.57.1) (2021-12-11)
Bug Fixes
- worker: better handling of block timeout (be4c933)
[1.57.0](https://github.com/taskforcesh/bullmq/compare/v1.56.0...v1.57.0) (2021-12-08)
Features
[1.56.0](https://github.com/taskforcesh/bullmq/compare/v1.55.1...v1.56.0) (2021-12-06)
Bug Fixes
- emit drain event if no jobs left when completing (9ad78a9)
- worker: use client for setting worker name (af65c2c)
Features
- worker: make moveToActive protected (d2897ee)
[1.55.1](https://github.com/taskforcesh/bullmq/compare/v1.55.0...v1.55.1) (2021-12-03)
Bug Fixes
[1.55.0](https://github.com/taskforcesh/bullmq/compare/v1.54.6...v1.55.0) (2021-12-02)
Features
[1.54.6](https://github.com/taskforcesh/bullmq/compare/v1.54.5...v1.54.6) (2021-11-30)
Bug Fixes
[1.54.5](https://github.com/taskforcesh/bullmq/compare/v1.54.4...v1.54.5) (2021-11-26)
Bug Fixes
[1.54.4](https://github.com/taskforcesh/bullmq/compare/v1.54.3...v1.54.4) (2021-11-24)
Bug Fixes
[1.54.3](https://github.com/taskforcesh/bullmq/compare/v1.54.2...v1.54.3) (2021-11-22)
Bug Fixes
[1.54.2](https://github.com/taskforcesh/bullmq/compare/v1.54.1...v1.54.2) (2021-11-20)
Bug Fixes
[1.54.1](https://github.com/taskforcesh/bullmq/compare/v1.54.0...v1.54.1) (2021-11-19)
Bug Fixes
[1.54.0](https://github.com/taskforcesh/bullmq/compare/v1.53.0...v1.54.0) (2021-11-17)
Features
[1.53.0](https://github.com/taskforcesh/bullmq/compare/v1.52.2...v1.53.0) (2021-11-16)
Features
[1.52.2](https://github.com/taskforcesh/bullmq/compare/v1.52.1...v1.52.2) (2021-11-14)
Bug Fixes
[1.52.1](https://github.com/taskforcesh/bullmq/compare/v1.52.0...v1.52.1) (2021-11-12)
Performance Improvements
[1.52.0](https://github.com/taskforcesh/bullmq/compare/v1.51.3...v1.52.0) (2021-11-11)
Features
[1.51.3](https://github.com/taskforcesh/bullmq/compare/v1.51.2...v1.51.3) (2021-11-04)
Bug Fixes
[1.51.2](https://github.com/taskforcesh/bullmq/compare/v1.51.1...v1.51.2) (2021-11-03)
Bug Fixes
[1.51.1](https://github.com/taskforcesh/bullmq/compare/v1.51.0...v1.51.1) (2021-10-29)
Bug Fixes
[1.51.0](https://github.com/taskforcesh/bullmq/compare/v1.50.7...v1.51.0) (2021-10-28)
Features
[1.50.7](https://github.com/taskforcesh/bullmq/compare/v1.50.6...v1.50.7) (2021-10-28)
Bug Fixes
- override enableReadyCheck, maxRetriesPerRequest fixes reconnection (09ba358)
- queue-base: deprecation warning on missing connection (2f79802)
[1.50.6](https://github.com/taskforcesh/bullmq/compare/v1.50.5...v1.50.6) (2021-10-28)
Bug Fixes
[1.50.5](https://github.com/taskforcesh/bullmq/compare/v1.50.4...v1.50.5) (2021-10-21)
Bug Fixes
[1.50.4](https://github.com/taskforcesh/bullmq/compare/v1.50.3...v1.50.4) (2021-10-20)
Bug Fixes
- properly pass sharedConnection option to worker base class (56557f1)
[1.50.3](https://github.com/taskforcesh/bullmq/compare/v1.50.2...v1.50.3) (2021-10-18)
Bug Fixes
[1.50.2](https://github.com/taskforcesh/bullmq/compare/v1.50.1...v1.50.2) (2021-10-12)
Bug Fixes
- msgpack: replace msgpack by msgpackr (dc13a75)
[1.50.1](https://github.com/taskforcesh/bullmq/compare/v1.50.0...v1.50.1) (2021-10-12)
Bug Fixes
- queue-getters: only getting the first 2 jobs (653873a)
[1.50.0](https://github.com/taskforcesh/bullmq/compare/v1.49.0...v1.50.0) (2021-10-12)
Features
- easier to build extensions on top of BullMQ (b1a9e64)
[1.49.0](https://github.com/taskforcesh/bullmq/compare/v1.48.3...v1.49.0) (2021-10-08)
Features
[1.48.3](https://github.com/taskforcesh/bullmq/compare/v1.48.2...v1.48.3) (2021-10-05)
Bug Fixes
[1.48.2](https://github.com/taskforcesh/bullmq/compare/v1.48.1...v1.48.2) (2021-09-24)
Performance Improvements
[1.48.1](https://github.com/taskforcesh/bullmq/compare/v1.48.0...v1.48.1) (2021-09-23)
Bug Fixes
[1.48.0](https://github.com/taskforcesh/bullmq/compare/v1.47.2...v1.48.0) (2021-09-23)
Features
[1.47.2](https://github.com/taskforcesh/bullmq/compare/v1.47.1...v1.47.2) (2021-09-22)
Bug Fixes
[1.47.1](https://github.com/taskforcesh/bullmq/compare/v1.47.0...v1.47.1) (2021-09-17)
Bug Fixes
[1.47.0](https://github.com/taskforcesh/bullmq/compare/v1.46.7...v1.47.0) (2021-09-16)
Features
[1.46.7](https://github.com/taskforcesh/bullmq/compare/v1.46.6...v1.46.7) (2021-09-16)
Bug Fixes
[1.46.6](https://github.com/taskforcesh/bullmq/compare/v1.46.5...v1.46.6) (2021-09-15)
Bug Fixes
[1.46.5](https://github.com/taskforcesh/bullmq/compare/v1.46.4...v1.46.5) (2021-09-12)
Bug Fixes
[1.46.4](https://github.com/taskforcesh/bullmq/compare/v1.46.3...v1.46.4) (2021-09-10)
Bug Fixes
[1.46.3](https://github.com/taskforcesh/bullmq/compare/v1.46.2...v1.46.3) (2021-09-08)
Bug Fixes
[1.46.2](https://github.com/taskforcesh/bullmq/compare/v1.46.1...v1.46.2) (2021-09-07)
Bug Fixes
[1.46.1](https://github.com/taskforcesh/bullmq/compare/v1.46.0...v1.46.1) (2021-09-06)
Bug Fixes
[1.46.0](https://github.com/taskforcesh/bullmq/compare/v1.45.0...v1.46.0) (2021-09-02)
Features
[1.45.0](https://github.com/taskforcesh/bullmq/compare/v1.44.3...v1.45.0) (2021-09-02)
Features
[1.44.3](https://github.com/taskforcesh/bullmq/compare/v1.44.2...v1.44.3) (2021-09-02)
Bug Fixes
[1.44.2](https://github.com/taskforcesh/bullmq/compare/v1.44.1...v1.44.2) (2021-08-29)
Bug Fixes
[1.44.1](https://github.com/taskforcesh/bullmq/compare/v1.44.0...v1.44.1) (2021-08-29)
Bug Fixes
[1.44.0](https://github.com/taskforcesh/bullmq/compare/v1.43.0...v1.44.0) (2021-08-27)
Features
[1.43.0](https://github.com/taskforcesh/bullmq/compare/v1.42.1...v1.43.0) (2021-08-25)
Features
[1.42.1](https://github.com/taskforcesh/bullmq/compare/v1.42.0...v1.42.1) (2021-08-23)
Bug Fixes
- protect emit calls with throw/catch (79f879b)
[1.42.0](https://github.com/taskforcesh/bullmq/compare/v1.41.0...v1.42.0) (2021-08-20)
Features
[1.41.0](https://github.com/taskforcesh/bullmq/compare/v1.40.4...v1.41.0) (2021-08-20)
Features
- flow: add bulk (dc59fe6)
[1.40.4](https://github.com/taskforcesh/bullmq/compare/v1.40.3...v1.40.4) (2021-08-06)
Bug Fixes
- rate-limiter: check groupKey is not undefined (999b918)
[1.40.3](https://github.com/taskforcesh/bullmq/compare/v1.40.2...v1.40.3) (2021-08-06)
Bug Fixes
- redis-connection: add error event in waitUntilReady (ac4101e)
[1.40.2](https://github.com/taskforcesh/bullmq/compare/v1.40.1...v1.40.2) (2021-08-06)
Bug Fixes
- move clientCommandMessageReg to utils (dd5d555)
[1.40.1](https://github.com/taskforcesh/bullmq/compare/v1.40.0...v1.40.1) (2021-07-24)
Bug Fixes
[1.40.0](https://github.com/taskforcesh/bullmq/compare/v1.39.5...v1.40.0) (2021-07-22)
Features
- worker: retry with delay errors in run loop (409fe7f)
[1.39.5](https://github.com/taskforcesh/bullmq/compare/v1.39.4...v1.39.5) (2021-07-21)
Bug Fixes
- move-to-finished: remove stalled jobs when finishing (3867126)
[1.39.4](https://github.com/taskforcesh/bullmq/compare/v1.39.3...v1.39.4) (2021-07-21)
Bug Fixes
- repeatable: validate endDate when adding next repeatable job (1324cbb)
[1.39.3](https://github.com/taskforcesh/bullmq/compare/v1.39.2...v1.39.3) (2021-07-16)
Bug Fixes
- connect if redis client has status "wait" (f711717)
[1.39.2](https://github.com/taskforcesh/bullmq/compare/v1.39.1...v1.39.2) (2021-07-15)
Bug Fixes
- queue: ensure the Queue constructor doesn't try to set queue options if the client is closed (b40c6eb)
[1.39.1](https://github.com/taskforcesh/bullmq/compare/v1.39.0...v1.39.1) (2021-07-15)
Bug Fixes
- sandbox: use updateProgress method name (27d62c3)
[1.39.0](https://github.com/taskforcesh/bullmq/compare/v1.38.1...v1.39.0) (2021-07-13)
Features
- worker+scheduler: add a "running" attribute for healthchecking (aae358e)
[1.38.1](https://github.com/taskforcesh/bullmq/compare/v1.38.0...v1.38.1) (2021-07-12)
Bug Fixes
- reprocess: do not store job.id in added list (9c0605e)
[1.38.0](https://github.com/taskforcesh/bullmq/compare/v1.37.1...v1.38.0) (2021-07-12)
Features
- queue: add missing events typings (b42e78c)
[1.37.1](https://github.com/taskforcesh/bullmq/compare/v1.37.0...v1.37.1) (2021-07-02)
Bug Fixes
[1.37.0](https://github.com/taskforcesh/bullmq/compare/v1.36.1...v1.37.0) (2021-06-30)
Features
- job: add changeDelay method for delayed jobs (f0a9f9c)
[1.36.1](https://github.com/taskforcesh/bullmq/compare/v1.36.0...v1.36.1) (2021-06-22)
Bug Fixes
- worker: change active event typing (220b4f6)
[1.36.0](https://github.com/taskforcesh/bullmq/compare/v1.35.0...v1.36.0) (2021-06-20)
Bug Fixes
- queue-events: fix drained typing (9cf711d)
Features
[1.35.0](https://github.com/taskforcesh/bullmq/compare/v1.34.2...v1.35.0) (2021-06-19)
Features
- worker: add drained event typing (ed5f315)
[1.34.2](https://github.com/taskforcesh/bullmq/compare/v1.34.1...v1.34.2) (2021-06-18)
Bug Fixes
- worker: await for processing functions (0566804)
[1.34.1](https://github.com/taskforcesh/bullmq/compare/v1.34.0...v1.34.1) (2021-06-18)
Bug Fixes
- redis-connection: remove error event listener from client (2d70fe7)
[1.34.0](https://github.com/taskforcesh/bullmq/compare/v1.33.1...v1.34.0) (2021-06-11)
Features
- job: expose queueName (8683bd4)
[1.33.1](https://github.com/taskforcesh/bullmq/compare/v1.33.0...v1.33.1) (2021-06-10)
Bug Fixes
- job: destructure default opts for pagination (73363a5)
[1.33.0](https://github.com/taskforcesh/bullmq/compare/v1.32.0...v1.33.0) (2021-06-10)
Features
- job: add getDependenciesCount method (ae39a4c)
[1.32.0](https://github.com/taskforcesh/bullmq/compare/v1.31.1...v1.32.0) (2021-06-07)
Features
- flow-producer: add getFlow method (ce93d04)
[1.31.1](https://github.com/taskforcesh/bullmq/compare/v1.31.0...v1.31.1) (2021-06-07)
Bug Fixes
- worker: remove processed key when removeOnComplete (4ec1b73)
[1.31.0](https://github.com/taskforcesh/bullmq/compare/v1.30.2...v1.31.0) (2021-06-04)
Features
- job: extend getDependencies to support pagination (9b61bbb)
[1.30.2](https://github.com/taskforcesh/bullmq/compare/v1.30.1...v1.30.2) (2021-06-03)
Bug Fixes
- job: parse results in getDependencies for processed jobs (6fdc701)
[1.30.1](https://github.com/taskforcesh/bullmq/compare/v1.30.0...v1.30.1) (2021-06-02)
Bug Fixes
- move-to-waiting-children: make opts optional (33bd76a)
[1.30.0](https://github.com/taskforcesh/bullmq/compare/v1.29.1...v1.30.0) (2021-06-02)
Features
- add some event typing (934c004)
[1.29.1](https://github.com/taskforcesh/bullmq/compare/v1.29.0...v1.29.1) (2021-05-31)
Bug Fixes
- move-stalled-jobs-to-wait: send failedReason to queueEvents (7c510b5)
[1.29.0](https://github.com/taskforcesh/bullmq/compare/v1.28.2...v1.29.0) (2021-05-31)
Features
[1.28.2](https://github.com/taskforcesh/bullmq/compare/v1.28.1...v1.28.2) (2021-05-31)
Bug Fixes
- obliterate: remove job logs (ea91895)
[1.28.1](https://github.com/taskforcesh/bullmq/compare/v1.28.0...v1.28.1) (2021-05-31)
Bug Fixes
[1.28.0](https://github.com/taskforcesh/bullmq/compare/v1.27.0...v1.28.0) (2021-05-24)
Features
- flow-producer: expose client connection (17d4263)
[1.27.0](https://github.com/taskforcesh/bullmq/compare/v1.26.5...v1.27.0) (2021-05-24)
Features
- repeat: add immediately opt for repeat (d095573)
[1.26.5](https://github.com/taskforcesh/bullmq/compare/v1.26.4...v1.26.5) (2021-05-21)
Bug Fixes
- movetofinished: use parent queue for events (1b17b62)
[1.26.4](https://github.com/taskforcesh/bullmq/compare/v1.26.3...v1.26.4) (2021-05-20)
Bug Fixes
- removejob: delete processed hash (a2a5058)
[1.26.3](https://github.com/taskforcesh/bullmq/compare/v1.26.2...v1.26.3) (2021-05-19)
Bug Fixes
[1.26.2](https://github.com/taskforcesh/bullmq/compare/v1.26.1...v1.26.2) (2021-05-18)
Bug Fixes
- getjoblogs: no reversed pagination (fb0c3a5)
[1.26.1](https://github.com/taskforcesh/bullmq/compare/v1.26.0...v1.26.1) (2021-05-17)
Bug Fixes
[1.26.0](https://github.com/taskforcesh/bullmq/compare/v1.25.1...v1.26.0) (2021-05-16)
Features
- custombackoff: provide job as third parameter (ddaf8dc)
[1.25.2](https://github.com/taskforcesh/bullmq/compare/v1.25.1...v1.25.2) (2021-05-16)
Bug Fixes
[1.25.1](https://github.com/taskforcesh/bullmq/compare/v1.25.0...v1.25.1) (2021-05-13)
Bug Fixes
- addbulk: should not consider repeat option (c85357e)
[1.25.0](https://github.com/taskforcesh/bullmq/compare/v1.24.5...v1.25.0) (2021-05-11)
Features
- job: add sizeLimit option when creating a job (f10aeeb)
[1.24.5](https://github.com/taskforcesh/bullmq/compare/v1.24.4...v1.24.5) (2021-05-08)
Bug Fixes
- deps: upgrading lodash to 4.17.21 (6e90c3f)
[1.24.4](https://github.com/taskforcesh/bullmq/compare/v1.24.3...v1.24.4) (2021-05-07)
Bug Fixes
[1.24.3](https://github.com/taskforcesh/bullmq/compare/v1.24.2...v1.24.3) (2021-05-05)
Bug Fixes
[1.24.2](https://github.com/taskforcesh/bullmq/compare/v1.24.1...v1.24.2) (2021-05-05)
Bug Fixes
- sandbox: handle broken processor files (2326983)
[1.24.1](https://github.com/taskforcesh/bullmq/compare/v1.24.0...v1.24.1) (2021-05-05)
Bug Fixes
[1.24.0](https://github.com/taskforcesh/bullmq/compare/v1.23.1...v1.24.0) (2021-05-03)
Features
- add option for non-blocking getNextJob (13ce2cf)
[1.23.1](https://github.com/taskforcesh/bullmq/compare/v1.23.0...v1.23.1) (2021-05-03)
Bug Fixes
- add return type for job.waitUntilFinished() (59ede97)
[1.23.0](https://github.com/taskforcesh/bullmq/compare/v1.22.2...v1.23.0) (2021-04-30)
Features
- job: pass parent opts to addBulk (7f21615)
[1.22.2](https://github.com/taskforcesh/bullmq/compare/v1.22.1...v1.22.2) (2021-04-29)
Bug Fixes
[1.22.1](https://github.com/taskforcesh/bullmq/compare/v1.22.0...v1.22.1) (2021-04-28)
Bug Fixes
- addjob: fix redis cluster CROSSSLOT (a5fd1d7)
[1.22.0](https://github.com/taskforcesh/bullmq/compare/v1.21.0...v1.22.0) (2021-04-28)
Features
- jobcreate: allow passing parent in job.create (ede3626)
[1.21.0](https://github.com/taskforcesh/bullmq/compare/v1.20.6...v1.21.0) (2021-04-26)
Features
- add typing for addNextRepeatableJob (a3be937)
[1.20.6](https://github.com/taskforcesh/bullmq/compare/v1.20.5...v1.20.6) (2021-04-25)
Bug Fixes
- movetocompleted: should not complete before children (812ff66)
[1.20.5](https://github.com/taskforcesh/bullmq/compare/v1.20.4...v1.20.5) (2021-04-23)
Bug Fixes
- obliterate: correctly remove many jobs (b5ae4ce)
[1.20.4](https://github.com/taskforcesh/bullmq/compare/v1.20.3...v1.20.4) (2021-04-23)
Bug Fixes
[1.20.3](https://github.com/taskforcesh/bullmq/compare/v1.20.2...v1.20.3) (2021-04-23)
Bug Fixes
[1.20.2](https://github.com/taskforcesh/bullmq/compare/v1.20.1...v1.20.2) (2021-04-22)
Bug Fixes
- movetodelayed: check if job is in active state (4e63f70)
[1.20.1](https://github.com/taskforcesh/bullmq/compare/v1.20.0...v1.20.1) (2021-04-22)
Bug Fixes
[1.20.0](https://github.com/taskforcesh/bullmq/compare/v1.19.3...v1.20.0) (2021-04-21)
Features
- worker: passing token in processor function (2249724)
[1.19.3](https://github.com/taskforcesh/bullmq/compare/v1.19.2...v1.19.3) (2021-04-20)
Bug Fixes
- movetocompleted: throw an error if job is not in active state (c2fe5d2)
[1.19.2](https://github.com/taskforcesh/bullmq/compare/v1.19.1...v1.19.2) (2021-04-19)
Bug Fixes
[1.19.1](https://github.com/taskforcesh/bullmq/compare/v1.19.0...v1.19.1) (2021-04-19)
Bug Fixes
- remove repeatable with obliterate (1c5e581)
[1.19.0](https://github.com/taskforcesh/bullmq/compare/v1.18.2...v1.19.0) (2021-04-19)
Features
- add workerDelay option to limiter (9b6ab8a)
[1.18.2](https://github.com/taskforcesh/bullmq/compare/v1.18.1...v1.18.2) (2021-04-16)
Bug Fixes
- add parentKey property to Job (febc60d)
[1.18.1](https://github.com/taskforcesh/bullmq/compare/v1.18.0...v1.18.1) (2021-04-16)
Bug Fixes
- rename Flow to FlowProducer class (c64321d)
[1.18.0](https://github.com/taskforcesh/bullmq/compare/v1.17.0...v1.18.0) (2021-04-16)
Features
- add remove support for flows (4e8a7ef)
[1.17.0](https://github.com/taskforcesh/bullmq/compare/v1.16.2...v1.17.0) (2021-04-16)
Features
- job: consider waiting-children state (2916dd5)
[1.16.2](https://github.com/taskforcesh/bullmq/compare/v1.16.1...v1.16.2) (2021-04-14)
Bug Fixes
- read lua scripts serially (69e73b8)
[1.16.1](https://github.com/taskforcesh/bullmq/compare/v1.16.0...v1.16.1) (2021-04-12)
Bug Fixes
[1.16.0](https://github.com/taskforcesh/bullmq/compare/v1.15.1...v1.16.0) (2021-04-12)
Features
[1.15.1](https://github.com/taskforcesh/bullmq/compare/v1.15.0...v1.15.1) (2021-03-19)
Bug Fixes
- obliterate: safer implementation (82f571f)
[1.15.0](https://github.com/taskforcesh/bullmq/compare/v1.14.8...v1.15.0) (2021-03-18)
Features
[1.14.8](https://github.com/taskforcesh/bullmq/compare/v1.14.7...v1.14.8) (2021-03-06)
Bug Fixes
[1.14.7](https://github.com/taskforcesh/bullmq/compare/v1.14.6...v1.14.7) (2021-02-16)
Bug Fixes
[1.14.6](https://github.com/taskforcesh/bullmq/compare/v1.14.5...v1.14.6) (2021-02-16)
Bug Fixes
[1.14.5](https://github.com/taskforcesh/bullmq/compare/v1.14.4...v1.14.5) (2021-02-16)
Bug Fixes
[1.14.4](https://github.com/taskforcesh/bullmq/compare/v1.14.3...v1.14.4) (2021-02-08)
Bug Fixes
[1.14.3](https://github.com/taskforcesh/bullmq/compare/v1.14.2...v1.14.3) (2021-02-07)
Bug Fixes
[1.14.2](https://github.com/taskforcesh/bullmq/compare/v1.14.1...v1.14.2) (2021-02-02)
Bug Fixes
- improve job timeout notification by giving the job name and id in the error message (#387) (ca886b1)
[1.14.1](https://github.com/taskforcesh/bullmq/compare/v1.14.0...v1.14.1) (2021-02-01)
Bug Fixes
- job finish queue events race condition (355bca5)
[1.14.0](https://github.com/taskforcesh/bullmq/compare/v1.13.0...v1.14.0) (2021-01-06)
Features
- job: expose extendLock as a public method (17e8431)
[1.13.0](https://github.com/taskforcesh/bullmq/compare/v1.12.3...v1.13.0) (2020-12-30)
Features
[1.12.3](https://github.com/taskforcesh/bullmq/compare/v1.12.2...v1.12.3) (2020-12-28)
Bug Fixes
- correctly handle "falsy" data values fixes #264 (becad91)
- worker: setname on worker blocking connection (645b633)
[1.12.2](https://github.com/taskforcesh/bullmq/compare/v1.12.1...v1.12.2) (2020-12-23)
Bug Fixes
[1.12.1](https://github.com/taskforcesh/bullmq/compare/v1.12.0...v1.12.1) (2020-12-21)
Bug Fixes
[1.12.0](https://github.com/taskforcesh/bullmq/compare/v1.11.2...v1.12.0) (2020-12-16)
Features
- add ability to get if queue is paused or not (e98b7d8)
[1.11.2](https://github.com/taskforcesh/bullmq/compare/v1.11.1...v1.11.2) (2020-12-15)
Bug Fixes
- promote jobs to the right "list" when paused (d3df615)
[1.11.1](https://github.com/taskforcesh/bullmq/compare/v1.11.0...v1.11.1) (2020-12-15)
Bug Fixes
- clientCommandMessageReg to support GCP memorystore v5 (8408dda)
[1.11.0](https://github.com/taskforcesh/bullmq/compare/v1.10.0...v1.11.0) (2020-11-24)
Bug Fixes
- add generic type to processor (d4f6501)
Features
- add name and return types to queue, worker and processor (4879715)
[1.10.0](https://github.com/taskforcesh/bullmq/compare/v1.9.0...v1.10.0) (2020-10-20)
Bug Fixes
- job: remove listeners before resolving promise (563ce92)
- worker: continue processing if handleFailed fails. fixes #286 (4ef1cbc)
- worker: fix memory leak on Promise.race (#282) (a78ab2b)
- worker: setname on worker blocking connection (#291) (50a87fc)
- remove async for loop in child pool fixes #229 (d77505e)
Features
[1.9.0](https://github.com/taskforcesh/bullmq/compare/v1.8.14...v1.9.0) (2020-07-19)
Features
- add grouped rate limiting (3a958dd)
[1.8.14](https://github.com/taskforcesh/bullmq/compare/v1.8.13...v1.8.14) (2020-07-03)
Bug Fixes
- typescript: fix typings, upgrade ioredis dependencies (#220) (7059f20)
- worker: return this.closing when calling close (b68c845)
[1.8.13](https://github.com/taskforcesh/bullmq/compare/v1.8.12...v1.8.13) (2020-06-05)
Bug Fixes
- redis-connection: run the load command for reused redis client (fab9bba)
[1.8.12](https://github.com/taskforcesh/bullmq/compare/v1.8.11...v1.8.12) (2020-06-04)
Bug Fixes
- remove unused options (23aadc3)
[1.8.11](https://github.com/taskforcesh/bullmq/compare/v1.8.10...v1.8.11) (2020-05-29)
Bug Fixes
- scheduler: remove unnecessary division by 4096 (4d25e95)
[1.8.10](https://github.com/taskforcesh/bullmq/compare/v1.8.9...v1.8.10) (2020-05-28)
Bug Fixes
[1.8.9](https://github.com/taskforcesh/bullmq/compare/v1.8.8...v1.8.9) (2020-05-25)
Bug Fixes
[1.8.8](https://github.com/taskforcesh/bullmq/compare/v1.8.7...v1.8.8) (2020-05-25)
Bug Fixes
- queue-base: error event is passed through (ad14e77)
- redis-connection: error event is passed through (a15b1a1)
- worker: error event is passed through (d7f0374)
[1.8.7](https://github.com/taskforcesh/bullmq/compare/v1.8.6...v1.8.7) (2020-04-10)
Bug Fixes
[1.8.6](https://github.com/taskforcesh/bullmq/compare/v1.8.5...v1.8.6) (2020-04-10)
Bug Fixes
- workers: do not call super.close() (ebd2ae1)
- make sure closing is returned in every close call (88c5948)
- scheduler: duplicate connections fixes #174 (011b8ac)
- worker: return this.closing when calling close (06d3d4f)
[1.8.5](https://github.com/taskforcesh/bullmq/compare/v1.8.4...v1.8.5) (2020-04-05)
Bug Fixes
- removed deprecated and unused node-uuid (c810579)
[1.8.4](https://github.com/taskforcesh/bullmq/compare/v1.8.3...v1.8.4) (2020-03-17)
Bug Fixes
- job: added nullable/optional properties (cef134f)
[1.8.3](https://github.com/taskforcesh/bullmq/compare/v1.8.2...v1.8.3) (2020-03-13)
Bug Fixes
- sandbox: If the child process is killed, remove it from the pool. (8fb0fb5)
[1.8.2](https://github.com/taskforcesh/bullmq/compare/v1.8.1...v1.8.2) (2020-03-03)
Bug Fixes
[1.8.1](https://github.com/taskforcesh/bullmq/compare/v1.8.0...v1.8.1) (2020-03-02)
Bug Fixes
[1.8.0](https://github.com/taskforcesh/bullmq/compare/v1.7.0...v1.8.0) (2020-03-02)
Bug Fixes
- cleanup signatures for queue add and addBulk (#127) (48e221b)
- exit code 12 when using inspect with child process (#137) (43ebc67)
Features
[1.7.0](https://github.com/taskforcesh/bullmq/compare/v1.6.8...v1.7.0) (2020-03-02)
Features
[1.6.8](https://github.com/taskforcesh/bullmq/compare/v1.6.7...v1.6.8) (2020-02-22)
Bug Fixes
- modified QueueGetters.getJob and Job.fromId to also return null to (65183fc)
- modified QueueGetters.getJob and Job.fromId to return undefined (ede352b)
[1.6.7](https://github.com/taskforcesh/bullmq/compare/v1.6.6...v1.6.7) (2020-01-16)
Bug Fixes
- don't fail a job when the worker already lost the lock (23c0bf7)
[1.6.6](https://github.com/taskforcesh/bullmq/compare/v1.6.5...v1.6.6) (2020-01-05)
Bug Fixes
- remove duplicate active entry (1d2cca3)
[1.6.5](https://github.com/taskforcesh/bullmq/compare/v1.6.4...v1.6.5) (2020-01-05)
Bug Fixes
- get rid of flushdb/flushall in tests (550c67b)
[1.6.4](https://github.com/taskforcesh/bullmq/compare/v1.6.3...v1.6.4) (2020-01-05)
Bug Fixes
- delete logs when cleaning jobs in set (b11c6c7)
[1.6.3](https://github.com/taskforcesh/bullmq/compare/v1.6.2...v1.6.3) (2020-01-01)
Bug Fixes
[1.6.2](https://github.com/taskforcesh/bullmq/compare/v1.6.1...v1.6.2) (2019-12-16)
Bug Fixes
- change default QueueEvents lastEventId to $ (3c5b01d)
- ensure QE ready before adding test events (fd190f4)
- explicitly test the behavior of .on and .once (ea11087)
[1.6.1](https://github.com/taskforcesh/bullmq/compare/v1.6.0...v1.6.1) (2019-12-16)
Bug Fixes
- check of existing redis instance (dd466b3)
[1.6.0](https://github.com/taskforcesh/bullmq/compare/v1.5.0...v1.6.0) (2019-12-12)
Features
- add generic type to job data and return value (87c0531)
[1.5.0](https://github.com/taskforcesh/bullmq/compare/v1.4.3...v1.5.0) (2019-11-22)
Features
[1.4.3](https://github.com/taskforcesh/bullmq/compare/v1.4.2...v1.4.3) (2019-11-21)
Bug Fixes
- check in moveToFinished to use default val for opts.maxLenEvents (d1118aa)
[1.4.2](https://github.com/taskforcesh/bullmq/compare/v1.4.1...v1.4.2) (2019-11-21)
Bug Fixes
- avoid Job<->Queue circular json error (5752727)
- avoid the .toJSON serializer interface #70 (5941b82)
[1.4.1](https://github.com/taskforcesh/bullmq/compare/v1.4.0...v1.4.1) (2019-11-08)
Bug Fixes
[1.4.0](https://github.com/taskforcesh/bullmq/compare/v1.3.0...v1.4.0) (2019-11-06)
Features
- job.progress() return last progress for sandboxed processors (5c4b146)
[1.3.0](https://github.com/taskforcesh/bullmq/compare/v1.2.0...v1.3.0) (2019-11-05)
Features
- test worker extends job lock while job is active (577efdf)
[1.2.0](https://github.com/taskforcesh/bullmq/compare/v1.1.0...v1.2.0) (2019-11-03)
Bug Fixes
- only run coveralls after success (bd51893)
Features
- added code coverage and coveralls (298cfc4)
- added missing deps for coverage (6f3ab8d)
- ignore commitlint file in coverage (f874441)
- only upload coverage once after all tests pass (a7f73ec)
[1.1.0](https://github.com/taskforcesh/bullmq/compare/v1.0.1...v1.1.0) (2019-11-01)
Bug Fixes
Features
- initial version of job locking mechanism (1d4fa38)
[1.0.1](https://github.com/taskforcesh/bullmq/compare/v1.0.0...v1.0.1) (2019-10-27)
Bug Fixes
1.0.0 (2019-10-20)
Bug Fixes
- add compilation step before running tests (64abc13)
- add extra client to worker fixes #34 (90bd891)
- add missing dependency (b92e330)
- check closing after resuming from pause (7b2cef3)
- default opts (333c73b)
- do not block if blockTime is zero (13b2df2)
- do not exec if closing (b1d1c08)
- do not trim if maxEvents is undefined (7edd8f4)
- emit wait event in add job (39cba31)
- fix a couple of job tests (e66b97b)
- fix compiling error (3cf2617)
- fix more tests (6a07b35)
- fix progress script (4228e27)
- fix retry functionality (ec41ea4)
- fix several floating promises (590a4a9)
- fixed reprocess lua script (b78296f)
- improve concurrency mechanism (a3f6148)
- improve disconnection for queue events (56b53a1)
- initialize events comsumption in constructor (dbb66cd)
- make ioredis typings a normal dependency (fb80b90)
- minor fixes (7791cda)
- parse progres and return value in events (9e43d0e)
- properly emit event for progress (3f70175)
- reduce drain delay to 5 seconds (c6cfe7c)
- remove buggy close() on redis-connection (fixes 5 failing tests) (64c2ede)
- remove unused dependencies (34293c8)
- replace init by waitUntilReady (4336161)
- reworked initialization of redis clients (c17d4be)
- several fixes to make the lib work on other ts projects (3cac1b0)
- throw error messages instead of codes (9267541)
- update tests after merge (51f75a4)
- wait until ready before trying to get jobs (f3b768f)
- connections: reused connections (1e808d2)
- waitUntilFinished improvements (18d4afe)
Features
- add cleaned event (c544775)
- add empty method (4376112)
- add retry errors (f6a7990)
- add script to generate typedocs (d0a8cb3)
- add some new tests for compat class, more minor fixes (bc0f653)
- add support for adding jobs in bulk (b62bddc)
- add trimEvents method to queue client (b7da7c4)
- automatically trim events (279bbba)
- emit global stalled event fixes #10 (241f229)
- get rid of Job3 in favor of bullmq Job class (7590cea)
- implement close in redis connection fixes #8 (6de8b48)
- make delay in backoffs optional (30d59e5)
- move async initialization to constructors (3fbacd0)
- port a lot of functionality from bull 3.x (ec9f3d2)
- port more features from bull 3.x (75bd261)
- ported tests and functionality from bull 3 (1b6b192)
- workers: support for async backoffs (c555837)
- remove support of bull3 config format in compat class (d909486)
- support global:progress event (60f4d85)
- trim option to event stream #21 & fix #17 (7eae653)
4.0.0-beta.2
Fixed
- Removed humans, they weren't doing fine with animals.
Changed
- Animals are now super cute, all of them.
4.0.0-beta.1
Added
- Introduced animals into the world, we believe they're going to be a neat addition.
4.0.0-beta.0
Gitbook Changelogs Changelog V2 (`docs/gitbook/changelogs/changelog-v2.md`)
[2.4.0](https://github.com/taskforcesh/bullmq/compare/v2.3.2...v2.4.0) (2022-10-24)
Features
[2.3.2](https://github.com/taskforcesh/bullmq/compare/v2.3.1...v2.3.2) (2022-10-18)
Bug Fixes
[2.3.1](https://github.com/taskforcesh/bullmq/compare/v2.3.0...v2.3.1) (2022-10-13)
Bug Fixes
- redis: replace throw exception by console.error (fafa2f8)
[2.3.0](https://github.com/taskforcesh/bullmq/compare/v2.2.1...v2.3.0) (2022-10-13)
Features
[2.2.1](https://github.com/taskforcesh/bullmq/compare/v2.2.0...v2.2.1) (2022-10-11)
Performance Improvements
[2.2.0](https://github.com/taskforcesh/bullmq/compare/v2.1.3...v2.2.0) (2022-10-10)
Bug Fixes
Features
[2.1.3](https://github.com/taskforcesh/bullmq/compare/v2.1.2...v2.1.3) (2022-09-30)
Bug Fixes
- worker: clear stalled jobs timer when closing worker (1567a0d)
[2.1.2](https://github.com/taskforcesh/bullmq/compare/v2.1.1...v2.1.2) (2022-09-29)
Bug Fixes
- getters: fix return type of getJobLogs (d452927)
[2.1.1](https://github.com/taskforcesh/bullmq/compare/v2.1.0...v2.1.1) (2022-09-28)
Bug Fixes
[2.1.0](https://github.com/taskforcesh/bullmq/compare/v2.0.2...v2.1.0) (2022-09-23)
Features
[2.0.2](https://github.com/taskforcesh/bullmq/compare/v2.0.1...v2.0.2) (2022-09-22)
Bug Fixes
[2.0.1](https://github.com/taskforcesh/bullmq/compare/v2.0.0...v2.0.1) (2022-09-21)
Bug Fixes
- connection: throw error when no noeviction policy (3468390)
Performance Improvements
- events: remove data and opts from added event (e13d4b8)
[2.0.0](https://github.com/taskforcesh/bullmq/compare/v1.91.1...v2.0.0) (2022-09-21)
Bug Fixes
- compat: remove Queue3 class (#1421) (fc797f7)
- delayed: promote delayed jobs instead of picking one by one (1b938af)
- delayed: remove marker when promoting delayed job (1aea0dc)
- getters: compensate for "mark" job id (231b9aa)
- sandbox: remove progress method (b43267b)
- stalled-jobs: handle job id 0 (829e6e0)
- worker: do not allow stalledInterval to be less than zero (831ffc5)
- workers: use connection closing to determine closing status (fe1d173)
Features
- improve delayed jobs and remove QueueScheduler (1f66e5a)
- move stalled jobs check and handling to Worker class from QueueScheduler (13769cb)
BREAKING CHANGES
- compat: The compatibility class for Bullv3 is no longer available.
- The QueueScheduler class is removed since it is not necessary anymore.
Delayed jobs are now handled in a much simpler and
robust way, without the need of a separate process. - Failed and stalled events are now produced by the Worker class instead of by the QueueScheduler.
- The minimum Redis recommended version is 6.2.0.
Gitbook Changelogs Changelog V3 (`docs/gitbook/changelogs/changelog-v3.md`)
[3.15.8](https://github.com/taskforcesh/bullmq/compare/v3.15.7...v3.15.8) (2023-06-16)
Bug Fixes
[3.15.7](https://github.com/taskforcesh/bullmq/compare/v3.15.6...v3.15.7) (2023-06-16)
Bug Fixes
[3.15.6](https://github.com/taskforcesh/bullmq/compare/v3.15.5...v3.15.6) (2023-06-13)
Bug Fixes
[3.15.5](https://github.com/taskforcesh/bullmq/compare/v3.15.4...v3.15.5) (2023-06-11)
Bug Fixes
[3.15.4](https://github.com/taskforcesh/bullmq/compare/v3.15.3...v3.15.4) (2023-06-08)
Bug Fixes
[3.15.3](https://github.com/taskforcesh/bullmq/compare/v3.15.2...v3.15.3) (2023-06-08)
Bug Fixes
[3.15.2](https://github.com/taskforcesh/bullmq/compare/v3.15.1...v3.15.2) (2023-06-06)
Bug Fixes
- worker: better worker client naming (c5f63af)
[3.15.1](https://github.com/taskforcesh/bullmq/compare/v3.15.0...v3.15.1) (2023-06-05)
Bug Fixes
[3.15.0](https://github.com/taskforcesh/bullmq/compare/v3.14.2...v3.15.0) (2023-05-31)
Features
[3.14.2](https://github.com/taskforcesh/bullmq/compare/v3.14.1...v3.14.2) (2023-05-30)
Bug Fixes
[3.14.1](https://github.com/taskforcesh/bullmq/compare/v3.14.0...v3.14.1) (2023-05-27)
Performance Improvements
[3.14.0](https://github.com/taskforcesh/bullmq/compare/v3.13.4...v3.14.0) (2023-05-22)
Features
- worker: make extendLocks overridable (7b1386b)
[3.13.4](https://github.com/taskforcesh/bullmq/compare/v3.13.3...v3.13.4) (2023-05-11)
Performance Improvements
[3.13.3](https://github.com/taskforcesh/bullmq/compare/v3.13.2...v3.13.3) (2023-05-10)
Bug Fixes
[3.13.2](https://github.com/taskforcesh/bullmq/compare/v3.13.1...v3.13.2) (2023-05-09)
Bug Fixes
[3.13.1](https://github.com/taskforcesh/bullmq/compare/v3.13.0...v3.13.1) (2023-05-07)
Bug Fixes
[3.13.0](https://github.com/taskforcesh/bullmq/compare/v3.12.1...v3.13.0) (2023-05-06)
Features
- worker: add worker threads support (0820985)
[3.12.1](https://github.com/taskforcesh/bullmq/compare/v3.12.0...v3.12.1) (2023-05-05)
Bug Fixes
[3.12.0](https://github.com/taskforcesh/bullmq/compare/v3.11.0...v3.12.0) (2023-04-20)
Features
- upgrade ioredis to 5.3.2 (375b1be)
[3.11.0](https://github.com/taskforcesh/bullmq/compare/v3.10.4...v3.11.0) (2023-04-17)
Features
- upstash: don't throw an error when detecting an upstash host (2e06bca)
[3.10.4](https://github.com/taskforcesh/bullmq/compare/v3.10.3...v3.10.4) (2023-04-05)
Bug Fixes
[3.10.3](https://github.com/taskforcesh/bullmq/compare/v3.10.2...v3.10.3) (2023-03-30)
Bug Fixes
[3.10.2](https://github.com/taskforcesh/bullmq/compare/v3.10.1...v3.10.2) (2023-03-22)
Bug Fixes
[3.10.1](https://github.com/taskforcesh/bullmq/compare/v3.10.0...v3.10.1) (2023-03-06)
Bug Fixes
[3.10.0](https://github.com/taskforcesh/bullmq/compare/v3.9.0...v3.10.0) (2023-03-02)
Bug Fixes
- worker: close lock extended timer (7995f18)
- worker: correct lock extender logic (6aa3569)
- worker: start stalled check timer (4763be0)
Features
- worker: replace Promise.race with efficient an async fifo (0d94e35)
- worker: simplify lock extension to one call independent of concurrency (ebf1aeb)
Performance Improvements
- scripts: reuse keys array to avoid allocations (feac7b4)
- worker: improve worker memory consumption (4846cf1)
[3.9.0](https://github.com/taskforcesh/bullmq/compare/v3.8.0...v3.9.0) (2023-02-25)
Features
[3.8.0](https://github.com/taskforcesh/bullmq/compare/v3.7.2...v3.8.0) (2023-02-23)
Bug Fixes
- worker: run stalled check directly first time (f71ec03)
Features
- worker: add a public method to run the stalled checker (3159266)
- worker: add support to disable stalled checks (49e860c)
[3.7.2](https://github.com/taskforcesh/bullmq/compare/v3.7.1...v3.7.2) (2023-02-23)
Bug Fixes
[3.7.1](https://github.com/taskforcesh/bullmq/compare/v3.7.0...v3.7.1) (2023-02-22)
Bug Fixes
[3.7.0](https://github.com/taskforcesh/bullmq/compare/v3.6.6...v3.7.0) (2023-02-16)
Performance Improvements
[3.6.6](https://github.com/taskforcesh/bullmq/compare/v3.6.5...v3.6.6) (2023-02-15)
Bug Fixes
[3.6.5](https://github.com/taskforcesh/bullmq/compare/v3.6.4...v3.6.5) (2023-02-11)
Bug Fixes
- infinite worker process spawned for invalid JS file (a445ba8)
[3.6.4](https://github.com/taskforcesh/bullmq/compare/v3.6.3...v3.6.4) (2023-02-09)
Bug Fixes
- worker: add a maximum block time (1a2618b)
[3.6.3](https://github.com/taskforcesh/bullmq/compare/v3.6.2...v3.6.3) (2023-02-07)
Bug Fixes
- master: copy type declaration (23ade6e)
[3.6.2](https://github.com/taskforcesh/bullmq/compare/v3.6.1...v3.6.2) (2023-02-03)
Bug Fixes
- redis: increase minimum default retry time (d521531)
[3.6.1](https://github.com/taskforcesh/bullmq/compare/v3.6.0...v3.6.1) (2023-01-31)
Bug Fixes
- connection: apply console.warn in noeviction message (95f171c)
[3.6.0](https://github.com/taskforcesh/bullmq/compare/v3.5.11...v3.6.0) (2023-01-31)
Features
[3.5.11](https://github.com/taskforcesh/bullmq/compare/v3.5.10...v3.5.11) (2023-01-27)
Bug Fixes
[3.5.10](https://github.com/taskforcesh/bullmq/compare/v3.5.9...v3.5.10) (2023-01-24)
Bug Fixes
[3.5.9](https://github.com/taskforcesh/bullmq/compare/v3.5.8...v3.5.9) (2023-01-19)
Bug Fixes
[3.5.8](https://github.com/taskforcesh/bullmq/compare/v3.5.7...v3.5.8) (2023-01-18)
Bug Fixes
[3.5.7](https://github.com/taskforcesh/bullmq/compare/v3.5.6...v3.5.7) (2023-01-17)
Bug Fixes
[3.5.6](https://github.com/taskforcesh/bullmq/compare/v3.5.5...v3.5.6) (2023-01-13)
Bug Fixes
[3.5.5](https://github.com/taskforcesh/bullmq/compare/v3.5.4...v3.5.5) (2023-01-10)
Bug Fixes
[3.5.4](https://github.com/taskforcesh/bullmq/compare/v3.5.3...v3.5.4) (2023-01-09)
Bug Fixes
[3.5.3](https://github.com/taskforcesh/bullmq/compare/v3.5.2...v3.5.3) (2023-01-07)
Bug Fixes
[3.5.2](https://github.com/taskforcesh/bullmq/compare/v3.5.1...v3.5.2) (2023-01-04)
Performance Improvements
[3.5.1](https://github.com/taskforcesh/bullmq/compare/v3.5.0...v3.5.1) (2022-12-23)
Bug Fixes
- connection: throw exception if using keyPrefix in ioredis (eb6a130)
- connection: use includes to check for upstash more reliably (12efb5c)
[3.5.0](https://github.com/taskforcesh/bullmq/compare/v3.4.2...v3.5.0) (2022-12-20)
Bug Fixes
- job: fetch parent before job moves to complete (#1580) (6a6c0dc)
- sandbox: throw error when no exported function (#1588) fixes #1587 (c031891)
Features
[3.4.2](https://github.com/taskforcesh/bullmq/compare/v3.4.1...v3.4.2) (2022-12-15)
Performance Improvements
- counts: delete delayed marker when needed (#1583) (cc26f1c)
- get-children-values: replace slow object destructuring with single object (#1586) (857d403)
[3.4.1](https://github.com/taskforcesh/bullmq/compare/v3.4.0...v3.4.1) (2022-12-10)
Bug Fixes
- exponential: respect exponential backoff delay (#1581) (145dd32)
- get-jobs: filter marker (#1551) (4add0ef)
[3.4.0](https://github.com/taskforcesh/bullmq/compare/v3.3.5...v3.4.0) (2022-12-09)
Features
[3.3.5](https://github.com/taskforcesh/bullmq/compare/v3.3.4...v3.3.5) (2022-12-08)
Bug Fixes
[3.3.4](https://github.com/taskforcesh/bullmq/compare/v3.3.3...v3.3.4) (2022-12-07)
Bug Fixes
[3.3.3](https://github.com/taskforcesh/bullmq/compare/v3.3.2...v3.3.3) (2022-12-07)
Bug Fixes
- do not allow move from active to wait if not owner of the job (dc1a307)
[3.3.2](https://github.com/taskforcesh/bullmq/compare/v3.3.1...v3.3.2) (2022-12-05)
Bug Fixes
- floor pexpire to integer (1d5de42)
[3.3.1](https://github.com/taskforcesh/bullmq/compare/v3.3.0...v3.3.1) (2022-12-05)
Bug Fixes
- get-workers: set name when ready event in connection (#1564) (de93c17)
- job: console warn custom job ids when they represent integers (#1569) (6e677d2)
[3.3.0](https://github.com/taskforcesh/bullmq/compare/v3.2.5...v3.3.0) (2022-12-04)
Features
[3.2.5](https://github.com/taskforcesh/bullmq/compare/v3.2.4...v3.2.5) (2022-12-04)
Bug Fixes
[3.2.4](https://github.com/taskforcesh/bullmq/compare/v3.2.3...v3.2.4) (2022-11-29)
Bug Fixes
[3.2.3](https://github.com/taskforcesh/bullmq/compare/v3.2.2...v3.2.3) (2022-11-29)
Bug Fixes
[3.2.2](https://github.com/taskforcesh/bullmq/compare/v3.2.1...v3.2.2) (2022-11-15)
Bug Fixes
- rate-limit: check job is active before moving to wait (9502167)
[3.2.1](https://github.com/taskforcesh/bullmq/compare/v3.2.0...v3.2.1) (2022-11-15)
Bug Fixes
[3.2.0](https://github.com/taskforcesh/bullmq/compare/v3.1.3...v3.2.0) (2022-11-09)
Features
[3.1.3](https://github.com/taskforcesh/bullmq/compare/v3.1.2...v3.1.3) (2022-11-04)
Bug Fixes
- delayed: better handling of marker id (816376e)
- delayed: notify workers a delayed job is closer in time fixes #1505 (6ced4d0)
- job: better error message in moveToFailed (4e9f5bb)
- moveToFinish: always promote delayed jobs (7610cc3)
- moveToFinished: revert move promoteDelayedJobs (7d780db)
[3.1.2](https://github.com/taskforcesh/bullmq/compare/v3.1.1...v3.1.2) (2022-11-04)
Bug Fixes
- repeat: allow easy migration from bullmq <3 to >=3 (e17b886)
[3.1.1](https://github.com/taskforcesh/bullmq/compare/v3.1.0...v3.1.1) (2022-11-03)
Bug Fixes
- change-delay: remove delayed stream (#1509) (6e4809e)
- worker: restore dynamic concurrency change (#1515) (fdac5c2)
[3.1.0](https://github.com/taskforcesh/bullmq/compare/v3.0.1...v3.1.0) (2022-11-02)
Features
- workers: better error message for missing lock (bf1d086)
[3.0.1](https://github.com/taskforcesh/bullmq/compare/v3.0.0...v3.0.1) (2022-11-02)
Bug Fixes
- move-to-delayed: consider promoting delayed jobs (#1493) (909da2b)
- retry-job: consider promoting delayed jobs (#1508) (d0b3412)
[3.0.0](https://github.com/taskforcesh/bullmq/compare/v2.4.0...v3.0.0) (2022-10-25)
Bug Fixes
- backoff: handle backoff strategy as function (#1463) (3640269)
- repeat: remove cron in favor of pattern option (#1456) (3cc150e)
Features
- add support for dynamic rate limiting (2d51d2b)
- rate-limit: remove group key support and improve global rate limit (81f780a)
BREAKING CHANGES
- rate-limit: limit by group keys has been removed in favor
of a much simpler and efficent rate-limit implementation. - backoff: object mapping is replaced by single function
Gitbook Changelogs Changelog V4 (`docs/gitbook/changelogs/changelog-v4.md`)
[4.18.3](https://github.com/taskforcesh/bullmq/compare/v4.18.2...v4.18.3) (2025-07-19)
Performance Improvements
[4.18.2](https://github.com/taskforcesh/bullmq/compare/v4.18.1...v4.18.2) (2024-10-24)
Bug Fixes
- proper way to get version (1a433d2)
[4.18.1](https://github.com/taskforcesh/bullmq/compare/v4.18.0...v4.18.1) (2024-10-19)
Bug Fixes
- use versions for lua commands (b0a216d)
[4.18.0](https://github.com/taskforcesh/bullmq/compare/v4.17.0...v4.18.0) (2024-10-14)
Features
- queue: add version support (a600463)
[4.17.0](https://github.com/taskforcesh/bullmq/compare/v4.16.0...v4.17.0) (2023-12-21)
Features
- sandbox: support URL (local files) as processor file (7eea670)
[4.16.0](https://github.com/taskforcesh/bullmq/compare/v4.15.4...v4.16.0) (2023-12-18)
Features
[4.15.4](https://github.com/taskforcesh/bullmq/compare/v4.15.3...v4.15.4) (2023-12-14)
Bug Fixes
[4.15.3](https://github.com/taskforcesh/bullmq/compare/v4.15.2...v4.15.3) (2023-12-13)
Bug Fixes
- sandboxed: better compatibility with esbuild (8eaf955)
[4.15.2](https://github.com/taskforcesh/bullmq/compare/v4.15.1...v4.15.2) (2023-12-07)
Bug Fixes
- child-processor: preserve dynamic imports in commonjs (d97a5e0)
[4.15.1](https://github.com/taskforcesh/bullmq/compare/v4.15.0...v4.15.1) (2023-12-06)
Bug Fixes
- flows: add meta key to queues created with flows (272ec69)
[4.15.0](https://github.com/taskforcesh/bullmq/compare/v4.14.4...v4.15.0) (2023-12-05)
Features
- sandboxes: use the more compatible dynamic import instead of require (6d2fe6e)
[4.14.4](https://github.com/taskforcesh/bullmq/compare/v4.14.3...v4.14.4) (2023-11-28)
Bug Fixes
[4.14.3](https://github.com/taskforcesh/bullmq/compare/v4.14.2...v4.14.3) (2023-11-27)
Bug Fixes
- update-progress: remove old updateProgress script to prevent conflict (#2298) (python) (e65b819)
- worker: get dirname by using module.filename (#2296) fixes #2288 (6e4db5a)
[4.14.2](https://github.com/taskforcesh/bullmq/compare/v4.14.1...v4.14.2) (2023-11-24)
Bug Fixes
- worker: should cap update progress events (2cab9e9)
[4.14.1](https://github.com/taskforcesh/bullmq/compare/v4.14.0...v4.14.1) (2023-11-23)
Bug Fixes
[4.14.0](https://github.com/taskforcesh/bullmq/compare/v4.13.3...v4.14.0) (2023-11-18)
Features
[4.13.3](https://github.com/taskforcesh/bullmq/compare/v4.13.2...v4.13.3) (2023-11-16)
Bug Fixes
[4.13.2](https://github.com/taskforcesh/bullmq/compare/v4.13.1...v4.13.2) (2023-11-09)
Bug Fixes
[4.13.1](https://github.com/taskforcesh/bullmq/compare/v4.13.0...v4.13.1) (2023-11-08)
Bug Fixes
- connection: better handling of attached listeners (02474ad)
- connection: move redis instance check to queue base (13a339a)
[4.13.0](https://github.com/taskforcesh/bullmq/compare/v4.12.10...v4.13.0) (2023-11-05)
Features
[4.12.10](https://github.com/taskforcesh/bullmq/compare/v4.12.9...v4.12.10) (2023-11-05)
Bug Fixes
[4.12.9](https://github.com/taskforcesh/bullmq/compare/v4.12.8...v4.12.9) (2023-11-05)
Bug Fixes
[4.12.8](https://github.com/taskforcesh/bullmq/compare/v4.12.7...v4.12.8) (2023-11-03)
Bug Fixes
[4.12.7](https://github.com/taskforcesh/bullmq/compare/v4.12.6...v4.12.7) (2023-10-29)
Performance Improvements
[4.12.6](https://github.com/taskforcesh/bullmq/compare/v4.12.5...v4.12.6) (2023-10-26)
Bug Fixes
[4.12.5](https://github.com/taskforcesh/bullmq/compare/v4.12.4...v4.12.5) (2023-10-18)
Performance Improvements
[4.12.4](https://github.com/taskforcesh/bullmq/compare/v4.12.3...v4.12.4) (2023-10-13)
Bug Fixes
[4.12.3](https://github.com/taskforcesh/bullmq/compare/v4.12.2...v4.12.3) (2023-10-10)
Bug Fixes
[4.12.2](https://github.com/taskforcesh/bullmq/compare/v4.12.1...v4.12.2) (2023-10-05)
Bug Fixes
[4.12.1](https://github.com/taskforcesh/bullmq/compare/v4.12.0...v4.12.1) (2023-10-04)
Bug Fixes
[4.12.0](https://github.com/taskforcesh/bullmq/compare/v4.11.4...v4.12.0) (2023-09-29)
Features
[4.11.4](https://github.com/taskforcesh/bullmq/compare/v4.11.3...v4.11.4) (2023-09-22)
Bug Fixes
[4.11.3](https://github.com/taskforcesh/bullmq/compare/v4.11.2...v4.11.3) (2023-09-22)
Bug Fixes
[4.11.2](https://github.com/taskforcesh/bullmq/compare/v4.11.1...v4.11.2) (2023-09-20)
Bug Fixes
[4.11.1](https://github.com/taskforcesh/bullmq/compare/v4.11.0...v4.11.1) (2023-09-20)
Bug Fixes
[4.11.0](https://github.com/taskforcesh/bullmq/compare/v4.10.0...v4.11.0) (2023-09-16)
Features
[4.10.0](https://github.com/taskforcesh/bullmq/compare/v4.9.0...v4.10.0) (2023-09-12)
Bug Fixes
- move-to-finished: consider addition of prioritized jobs when processing last active job (#2176) (python) (4b01f35)
- remove: change error message when job is locked (python) (#2175) (2f5628f)
[4.9.0](https://github.com/taskforcesh/bullmq/compare/v4.8.0...v4.9.0) (2023-09-05)
Features
[4.8.0](https://github.com/taskforcesh/bullmq/compare/v4.7.4...v4.8.0) (2023-08-20)
Features
[4.7.4](https://github.com/taskforcesh/bullmq/compare/v4.7.3...v4.7.4) (2023-08-19)
Bug Fixes
[4.7.3](https://github.com/taskforcesh/bullmq/compare/v4.7.2...v4.7.3) (2023-08-17)
Bug Fixes
- worker: abort rate-limit delay when closing worker (264a81c)
[4.7.2](https://github.com/taskforcesh/bullmq/compare/v4.7.1...v4.7.2) (2023-08-12)
Bug Fixes
[4.7.1](https://github.com/taskforcesh/bullmq/compare/v4.7.0...v4.7.1) (2023-08-10)
Performance Improvements
[4.7.0](https://github.com/taskforcesh/bullmq/compare/v4.6.3...v4.7.0) (2023-08-03)
Features
[4.6.3](https://github.com/taskforcesh/bullmq/compare/v4.6.2...v4.6.3) (2023-07-28)
Performance Improvements
[4.6.2](https://github.com/taskforcesh/bullmq/compare/v4.6.0...v4.6.2) (2023-07-26)
Performance Improvements
[4.6.0](https://github.com/taskforcesh/bullmq/compare/v4.5.0...v4.6.0) (2023-07-19)
Features
- queue: add promoteJobs to promote all delayed jobs (6074592)
[4.5.0](https://github.com/taskforcesh/bullmq/compare/v4.4.0...v4.5.0) (2023-07-18)
Features
[4.4.0](https://github.com/taskforcesh/bullmq/compare/v4.3.0...v4.4.0) (2023-07-17)
Features
[4.3.0](https://github.com/taskforcesh/bullmq/compare/v4.2.1...v4.3.0) (2023-07-14)
Features
[4.2.1](https://github.com/taskforcesh/bullmq/compare/v4.2.0...v4.2.1) (2023-07-10)
Bug Fixes
[4.2.0](https://github.com/taskforcesh/bullmq/compare/v4.1.0...v4.2.0) (2023-07-03)
Features
[4.1.0](https://github.com/taskforcesh/bullmq/compare/v4.0.0...v4.1.0) (2023-06-23)
Features
[4.0.0](https://github.com/taskforcesh/bullmq/compare/v3.15.8...v4.0.0) (2023-06-21)
Features
- queue: add removeDeprecatedPriorityKey method
Performance Improvements
BREAKING CHANGES
priority: priority is separeted in its own zset, no duplication needed
job: change job method name update to updateData
Gitbook Changelogs Changelog V5 (`docs/gitbook/changelogs/changelog-v5.md`)
[5.81.4](https://github.com/taskforcesh/bullmq/compare/v5.81.3...v5.81.4) (2026-08-27)
Bug Fixes
[5.81.3](https://github.com/taskforcesh/bullmq/compare/v5.81.2...v5.81.3) (2026-07-30)
Bug Fixes
- deps: update dependency msgpackr to v2.0.5 [security] (#4387) (6fccb59)
- worker: recover blocking client after sentinel disconnect, fixes (#4384) (93649b8)
[5.81.2](https://github.com/taskforcesh/bullmq/compare/v5.81.1...v5.81.2) (2026-07-24)
Bug Fixes
- prevent unhandled rejection when a connection's init fails before an 'error' listener is attached (#4328) (315ec33)
- telemetry: emit job.state while preserving job.status compatibility (#4293) (36a3b2a)
[5.81.1](https://github.com/taskforcesh/bullmq/compare/v5.81.0...v5.81.1) (2026-07-24)
Bug Fixes
- queue: retrieve jobs in same transaction under getJobs (#4300) (python) (elixir) (php) (rust) (8571503)
[5.81.0](https://github.com/taskforcesh/bullmq/compare/v5.80.12...v5.81.0) (2026-07-23)
Features
[5.80.12](https://github.com/taskforcesh/bullmq/compare/v5.80.11...v5.80.12) (2026-07-23)
Bug Fixes
- bun: match Bun RedisClient callback types and suppress teardown ConnectionClosedError (#4329) fixes #4212 (c7bd217)
[5.80.11](https://github.com/taskforcesh/bullmq/compare/v5.80.10...v5.80.11) (2026-07-23)
Bug Fixes
[5.80.10](https://github.com/taskforcesh/bullmq/compare/v5.80.9...v5.80.10) (2026-07-21)
Bug Fixes
- Nothing changed, triggered by a ci OSV change
[5.80.9](https://github.com/taskforcesh/bullmq/compare/v5.80.8...v5.80.9) (2026-07-18)
Performance Improvements
[5.80.8](https://github.com/taskforcesh/bullmq/compare/v5.80.7...v5.80.8) (2026-07-18)
Bug Fixes
[5.80.7](https://github.com/taskforcesh/bullmq/compare/v5.80.6...v5.80.7) (2026-07-17)
Bug Fixes
[5.80.6](https://github.com/taskforcesh/bullmq/compare/v5.80.5...v5.80.6) (2026-07-17)
Bug Fixes
[5.80.5](https://github.com/taskforcesh/bullmq/compare/v5.80.4...v5.80.5) (2026-07-16)
Bug Fixes
[5.80.4](https://github.com/taskforcesh/bullmq/compare/v5.80.3...v5.80.4) (2026-07-15)
Bug Fixes
[5.80.3](https://github.com/taskforcesh/bullmq/compare/v5.80.2...v5.80.3) (2026-07-15)
Bug Fixes
[5.80.2](https://github.com/taskforcesh/bullmq/compare/v5.80.1...v5.80.2) (2026-07-11)
Bug Fixes
[5.80.1](https://github.com/taskforcesh/bullmq/compare/v5.80.0...v5.80.1) (2026-07-10)
Bug Fixes
[5.80.0](https://github.com/taskforcesh/bullmq/compare/v5.79.4...v5.80.0) (2026-07-10)
- Nothing changed, triggered by a rust version release
[5.79.4](https://github.com/taskforcesh/bullmq/compare/v5.79.3...v5.79.4) (2026-07-10)
Bug Fixes
[5.79.3](https://github.com/taskforcesh/bullmq/compare/v5.79.2...v5.79.3) (2026-07-07)
Bug Fixes
[5.79.2](https://github.com/taskforcesh/bullmq/compare/v5.79.1...v5.79.2) (2026-06-27)
Bug Fixes
- flow: use correct data structure when retrying failed child using ignoreDependencyOnFailure fixes #4235 (#4236) (6f1b2e3)
[5.79.1](https://github.com/taskforcesh/bullmq/compare/v5.79.0...v5.79.1) (2026-06-21)
Bug Fixes
[5.79.0](https://github.com/taskforcesh/bullmq/compare/v5.78.1...v5.79.0) (2026-06-18)
Features
- Nothing changed, triggered by a rust version release
[5.78.1](https://github.com/taskforcesh/bullmq/compare/v5.78.0...v5.78.1) (2026-06-13)
Bug Fixes
[5.78.0](https://github.com/taskforcesh/bullmq/compare/v5.77.7...v5.78.0) (2026-06-02)
Features
- Nothing changed, triggered by a rust version release
[5.77.7](https://github.com/taskforcesh/bullmq/compare/v5.77.6...v5.77.7) (2026-06-01)
Bug Fixes
[5.77.6](https://github.com/taskforcesh/bullmq/compare/v5.77.5...v5.77.6) (2026-05-27)
Bug Fixes
[5.77.5](https://github.com/taskforcesh/bullmq/compare/v5.77.4...v5.77.5) (2026-05-27)
Bug Fixes
[5.77.4](https://github.com/taskforcesh/bullmq/compare/v5.77.3...v5.77.4) (2026-05-26)
Bug Fixes
- deduplication: preserve custom jobId when requeuing keepLastIfActive proto-jobs (#4190) fixes #4030 (6e4972e)
[5.77.3](https://github.com/taskforcesh/bullmq/compare/v5.77.2...v5.77.3) (2026-05-25)
Performance Improvements
[5.77.2](https://github.com/taskforcesh/bullmq/compare/v5.77.1...v5.77.2) (2026-05-24)
Bug Fixes
- connection: use more permissive typing on NodeRedisRawClient options (#4184) (#4187) (0feec14), closes #4170
[5.77.1](https://github.com/taskforcesh/bullmq/compare/v5.77.0...v5.77.1) (2026-05-23)
Bug Fixes
[5.77.0](https://github.com/taskforcesh/bullmq/compare/v5.76.11...v5.77.0) (2026-05-21)
Features
[5.76.11](https://github.com/taskforcesh/bullmq/compare/v5.76.10...v5.76.11) (2026-05-21)
Bug Fixes
[5.76.10](https://github.com/taskforcesh/bullmq/compare/v5.76.9...v5.76.10) (2026-05-17)
Bug Fixes
- flow: respect parent attribute deletion from child when calling removeChildDependency (#4169) (6396b4e)
[5.76.9](https://github.com/taskforcesh/bullmq/compare/v5.76.8...v5.76.9) (2026-05-16)
Bug Fixes
[5.76.8](https://github.com/taskforcesh/bullmq/compare/v5.76.7...v5.76.8) (2026-05-12)
Bug Fixes
[5.76.7](https://github.com/taskforcesh/bullmq/compare/v5.76.6...v5.76.7) (2026-05-11)
Bug Fixes
[5.76.6](https://github.com/taskforcesh/bullmq/compare/v5.76.5...v5.76.6) (2026-05-06)
Bug Fixes
[5.76.5](https://github.com/taskforcesh/bullmq/compare/v5.76.4...v5.76.5) (2026-05-02)
Bug Fixes
[5.76.4](https://github.com/taskforcesh/bullmq/compare/v5.76.3...v5.76.4) (2026-04-29)
Bug Fixes
[5.76.3](https://github.com/taskforcesh/bullmq/compare/v5.76.2...v5.76.3) (2026-04-28)
Bug Fixes
- metrics: add total counters to Prometheus export for accurate counts with auto-removal (#3967) (0bf1b4d)
[5.76.2](https://github.com/taskforcesh/bullmq/compare/v5.76.1...v5.76.2) (2026-04-25)
Bug Fixes
[5.76.1](https://github.com/taskforcesh/bullmq/compare/v5.76.0...v5.76.1) (2026-04-22)
Bug Fixes
[5.76.0](https://github.com/taskforcesh/bullmq/compare/v5.75.2...v5.76.0) (2026-04-22)
Features
- Nothing changed, triggered by a python version release
[5.75.2](https://github.com/taskforcesh/bullmq/compare/v5.75.1...v5.75.2) (2026-04-20)
Bug Fixes
[5.75.1](https://github.com/taskforcesh/bullmq/compare/v5.75.0...v5.75.1) (2026-04-20)
Bug Fixes
- Nothing changed, triggered by a python version release
[5.75.0](https://github.com/taskforcesh/bullmq/compare/v5.74.2...v5.75.0) (2026-04-20)
Features
- Nothing changed, triggered by a python version release
[5.74.2](https://github.com/taskforcesh/bullmq/compare/v5.74.1...v5.74.2) (2026-04-20)
Bug Fixes
- types: correct unsafe type cast in getJob to include undefined (37c4bb3)
[5.74.1](https://github.com/taskforcesh/bullmq/compare/v5.74.0...v5.74.1) (2026-04-15)
Bug Fixes
[5.74.0](https://github.com/taskforcesh/bullmq/compare/v5.73.5...v5.74.0) (2026-04-15)
Features
[5.73.5](https://github.com/taskforcesh/bullmq/compare/v5.73.4...v5.73.5) (2026-04-12)
Bug Fixes
[5.73.4](https://github.com/taskforcesh/bullmq/compare/v5.73.3...v5.73.4) (2026-04-10)
Bug Fixes
[5.73.3](https://github.com/taskforcesh/bullmq/compare/v5.73.2...v5.73.3) (2026-04-09)
Performance Improvements
[5.73.2](https://github.com/taskforcesh/bullmq/compare/v5.73.1...v5.73.2) (2026-04-09)
Bug Fixes
[5.73.1](https://github.com/taskforcesh/bullmq/compare/v5.73.0...v5.73.1) (2026-04-08)
Bug Fixes
[5.73.0](https://github.com/taskforcesh/bullmq/compare/v5.72.1...v5.73.0) (2026-04-03)
Features
[5.72.1](https://github.com/taskforcesh/bullmq/compare/v5.72.0...v5.72.1) (2026-04-02)
Bug Fixes
[5.72.0](https://github.com/taskforcesh/bullmq/compare/v5.71.1...v5.72.0) (2026-04-01)
Features
- deduplication: add keepLastIfActive option for at-least-once-after-active semantics (#3902) (aa529bc)
[5.71.1](https://github.com/taskforcesh/bullmq/compare/v5.71.0...v5.71.1) (2026-03-25)
Bug Fixes
[5.71.0](https://github.com/taskforcesh/bullmq/compare/v5.70.4...v5.71.0) (2026-03-11)
Features
[5.70.4](https://github.com/taskforcesh/bullmq/compare/v5.70.3...v5.70.4) (2026-03-06)
Bug Fixes
[5.70.3](https://github.com/taskforcesh/bullmq/compare/v5.70.2...v5.70.3) (2026-03-06)
Bug Fixes
[5.70.2](https://github.com/taskforcesh/bullmq/compare/v5.70.1...v5.70.2) (2026-03-05)
Bug Fixes
[5.70.1](https://github.com/taskforcesh/bullmq/compare/v5.70.0...v5.70.1) (2026-02-23)
Bug Fixes
[5.70.0](https://github.com/taskforcesh/bullmq/compare/v5.69.4...v5.70.0) (2026-02-21)
Features
[5.69.4](https://github.com/taskforcesh/bullmq/compare/v5.69.3...v5.69.4) (2026-02-21)
Bug Fixes
[5.69.3](https://github.com/taskforcesh/bullmq/compare/v5.69.2...v5.69.3) (2026-02-16)
Bug Fixes
[5.69.2](https://github.com/taskforcesh/bullmq/compare/v5.69.1...v5.69.2) (2026-02-14)
Bug Fixes
[5.69.1](https://github.com/taskforcesh/bullmq/compare/v5.69.0...v5.69.1) (2026-02-13)
Bug Fixes
[5.69.0](https://github.com/taskforcesh/bullmq/compare/v5.68.0...v5.69.0) (2026-02-12)
Features
[5.68.0](https://github.com/taskforcesh/bullmq/compare/v5.67.3...v5.68.0) (2026-02-11)
Features
[5.67.3](https://github.com/taskforcesh/bullmq/compare/v5.67.2...v5.67.3) (2026-02-05)
Bug Fixes
[5.67.2](https://github.com/taskforcesh/bullmq/compare/v5.67.1...v5.67.2) (2026-01-28)
Bug Fixes
[5.67.1](https://github.com/taskforcesh/bullmq/compare/v5.67.0...v5.67.1) (2026-01-24)
Bug Fixes
[5.67.0](https://github.com/taskforcesh/bullmq/compare/v5.66.7...v5.67.0) (2026-01-24)
Features
- job: add job name and id as telemetry attributes in complete, retry, delay and failed spans (#3707) ref #3692 (6294b36)
[5.66.7](https://github.com/taskforcesh/bullmq/compare/v5.66.6...v5.66.7) (2026-01-23)
Bug Fixes
[5.66.6](https://github.com/taskforcesh/bullmq/compare/v5.66.5...v5.66.6) (2026-01-22)
Performance Improvements
[5.66.5](https://github.com/taskforcesh/bullmq/compare/v5.66.4...v5.66.5) (2026-01-12)
Bug Fixes
[5.66.4](https://github.com/taskforcesh/bullmq/compare/v5.66.3...v5.66.4) (2025-12-27)
Bug Fixes
[5.66.3](https://github.com/taskforcesh/bullmq/compare/v5.66.2...v5.66.3) (2025-12-26)
Bug Fixes
[5.66.2](https://github.com/taskforcesh/bullmq/compare/v5.66.1...v5.66.2) (2025-12-19)
Bug Fixes
[5.66.1](https://github.com/taskforcesh/bullmq/compare/v5.66.0...v5.66.1) (2025-12-17)
Bug Fixes
[5.66.0](https://github.com/taskforcesh/bullmq/compare/v5.65.1...v5.66.0) (2025-12-11)
Features
- job: allow resetting attemptsMade and attemptsStarted attributes on retry (#3596) ref #2152 (241d847)
[5.65.1](https://github.com/taskforcesh/bullmq/compare/v5.65.0...v5.65.1) (2025-12-01)
Bug Fixes
[5.65.0](https://github.com/taskforcesh/bullmq/compare/v5.64.1...v5.65.0) (2025-11-26)
Features
[5.64.1](https://github.com/taskforcesh/bullmq/compare/v5.64.0...v5.64.1) (2025-11-21)
Performance Improvements
[5.64.0](https://github.com/taskforcesh/bullmq/compare/v5.63.2...v5.64.0) (2025-11-20)
Features
[5.63.2](https://github.com/taskforcesh/bullmq/compare/v5.63.1...v5.63.2) (2025-11-15)
Bug Fixes
[5.63.1](https://github.com/taskforcesh/bullmq/compare/v5.63.0...v5.63.1) (2025-11-13)
Bug Fixes
[5.63.0](https://github.com/taskforcesh/bullmq/compare/v5.62.2...v5.63.0) (2025-10-31)
Bug Fixes
Features
[5.62.2](https://github.com/taskforcesh/bullmq/compare/v5.62.1...v5.62.2) (2025-10-30)
Bug Fixes
[5.62.1](https://github.com/taskforcesh/bullmq/compare/v5.62.0...v5.62.1) (2025-10-30)
Performance Improvements
[5.62.0](https://github.com/taskforcesh/bullmq/compare/v5.61.2...v5.62.0) (2025-10-28)
Features
[5.61.2](https://github.com/taskforcesh/bullmq/compare/v5.61.0...v5.61.2) (2025-10-23)
Bug Fixes
- worker: only emit error when moveToActive failed (0aa7cc5)
- queue: emit removed event when calling remove method (#3492) fixes #2668 (7a3f2fa1)
- worker: emit error once when failure happens in moveToFinished (#3498) (4b4bd97e)
[5.61.0](https://github.com/taskforcesh/bullmq/compare/v5.60.0...v5.61.0) (2025-10-06)
Features
Bug Fixes
[5.60.0](https://github.com/taskforcesh/bullmq/compare/v5.59.0...v5.60.0) (2025-10-03)
Features
[5.59.0](https://github.com/taskforcesh/bullmq/compare/v5.58.9...v5.59.0) (2025-09-29)
Features
- deduplication: support replace option in single mode (#3472) (eea35b7)
- sandbox: support mjs files (#3476) ref #3474 (2e2b214)
- worker: support maxStartedAttempts option (#3331) (9384a64)
Performance Improvements
[5.58.9](https://github.com/taskforcesh/bullmq/compare/v5.58.8...v5.58.9) (2025-09-26)
Performance Improvements
[5.58.8](https://github.com/taskforcesh/bullmq/compare/v5.58.7...v5.58.8) (2025-09-25)
Bug Fixes
[5.58.7](https://github.com/taskforcesh/bullmq/compare/v5.58.6...v5.58.7) (2025-09-19)
Bug Fixes
[5.58.6](https://github.com/taskforcesh/bullmq/compare/v5.58.5...v5.58.6) (2025-09-19)
Bug Fixes
- deps: upgrade uuid to v11 (#3452) (bd8fbc1)
- events: set prev param as active when calling retryJob script (#3426) (e0ebd15)
- deduplication: validate id option is provided (#3443) fixes #3432 (533b844)
[5.58.5](https://github.com/taskforcesh/bullmq/compare/v5.58.4...v5.58.5) (2025-09-04)
Bug Fixes
[5.58.4](https://github.com/taskforcesh/bullmq/compare/v5.58.3...v5.58.4) (2025-08-30)
Bug Fixes
[5.58.3](https://github.com/taskforcesh/bullmq/compare/v5.58.2...v5.58.3) (2025-08-29)
Bug Fixes
[5.58.2](https://github.com/taskforcesh/bullmq/compare/v5.58.1...v5.58.2) (2025-08-26)
Bug Fixes
[5.58.1](https://github.com/taskforcesh/bullmq/compare/v5.58.0...v5.58.1) (2025-08-23)
Bug Fixes
[5.58.0](https://github.com/taskforcesh/bullmq/compare/v5.57.0...v5.58.0) (2025-08-15)
Features
[5.57.0](https://github.com/taskforcesh/bullmq/compare/v5.56.10...v5.57.0) (2025-08-13)
Features
[5.56.10](https://github.com/taskforcesh/bullmq/compare/v5.56.9...v5.56.10) (2025-08-10)
Bug Fixes
- scheduler: consider startDate to generate nextMillis when using pattern (#3385) fixes #3378 (53754fb)
[5.56.9](https://github.com/taskforcesh/bullmq/compare/v5.56.8...v5.56.9) (2025-07-31)
Bug Fixes
[5.56.8](https://github.com/taskforcesh/bullmq/compare/v5.56.7...v5.56.8) (2025-07-27)
Bug Fixes
[5.56.7](https://github.com/taskforcesh/bullmq/compare/v5.56.6...v5.56.7) (2025-07-25)
Bug Fixes
- flow: remove parent from active when there are unsuccessful children (#3348) (34ee339)
- worker: do not keep active jobs when pausing or closing (#3350) fixes #3349 (424d155)
[5.56.6](https://github.com/taskforcesh/bullmq/compare/v5.56.5...v5.56.6) (2025-07-25)
Bug Fixes
- repeat: use legacy updateRepeatableJob script when old format is present (#3364) fixes #3275 (1e221d5)
[5.56.5](https://github.com/taskforcesh/bullmq/compare/v5.56.4...v5.56.5) (2025-07-19)
Bug Fixes
[5.56.4](https://github.com/taskforcesh/bullmq/compare/v5.56.3...v5.56.4) (2025-07-11)
Bug Fixes
- connection: ignore info command when skipVersionCheck is provided as true (#3342) fixes #3341 (b94d7ed)
[5.56.3](https://github.com/taskforcesh/bullmq/compare/v5.56.2...v5.56.3) (2025-07-10)
Bug Fixes
[5.56.2](https://github.com/taskforcesh/bullmq/compare/v5.56.1...v5.56.2) (2025-07-08)
Performance Improvements
[5.56.1](https://github.com/taskforcesh/bullmq/compare/v5.56.0...v5.56.1) (2025-07-03)
Performance Improvements
[5.56.0](https://github.com/taskforcesh/bullmq/compare/v5.55.0...v5.56.0) (2025-06-22)
Features
[5.55.0](https://github.com/taskforcesh/bullmq/compare/v5.54.3...v5.55.0) (2025-06-21)
Features
[5.54.3](https://github.com/taskforcesh/bullmq/compare/v5.54.2...v5.54.3) (2025-06-18)
Bug Fixes
[5.54.2](https://github.com/taskforcesh/bullmq/compare/v5.54.1...v5.54.2) (2025-06-17)
Bug Fixes
[5.54.1](https://github.com/taskforcesh/bullmq/compare/v5.54.0...v5.54.1) (2025-06-17)
Performance Improvements
[5.54.0](https://github.com/taskforcesh/bullmq/compare/v5.53.3...v5.54.0) (2025-06-15)
Features
[5.53.3](https://github.com/taskforcesh/bullmq/compare/v5.53.2...v5.53.3) (2025-06-13)
Bug Fixes
[5.53.2](https://github.com/taskforcesh/bullmq/compare/v5.53.1...v5.53.2) (2025-06-02)
Performance Improvements
[5.53.1](https://github.com/taskforcesh/bullmq/compare/v5.53.0...v5.53.1) (2025-05-30)
Bug Fixes
- job: do not parse ignored failures in getDependencies (#3284) fixes #3283 (04ca6b5)
- scheduler: remove current job when it is in delayed state (#3269) fixes #3262 #3272 (1ca4cbd)
[5.53.0](https://github.com/taskforcesh/bullmq/compare/v5.52.3...v5.53.0) (2025-05-21)
Features
[5.52.3](https://github.com/taskforcesh/bullmq/compare/v5.52.2...v5.52.3) (2025-05-19)
Bug Fixes
Features
[5.52.2](https://github.com/taskforcesh/bullmq/compare/v5.52.1...v5.52.2) (2025-05-08)
Bug Fixes
[5.52.1](https://github.com/taskforcesh/bullmq/compare/v5.52.0...v5.52.1) (2025-05-02)
Bug Fixes
[5.52.0](https://github.com/taskforcesh/bullmq/compare/v5.51.1...v5.52.0) (2025-05-01)
Bug Fixes
Features
[5.51.1](https://github.com/taskforcesh/bullmq/compare/v5.51.0...v5.51.1) (2025-04-26)
Bug Fixes
[5.51.0](https://github.com/taskforcesh/bullmq/compare/v5.50.0...v5.51.0) (2025-04-25)
Bug Fixes
- job-scheduler: remove next delayed job if present even if scheduler does not exist (#3203) ref #3197 (61395bf)
Features
[5.50.0](https://github.com/taskforcesh/bullmq/compare/v5.49.2...v5.50.0) (2025-04-25)
Bug Fixes
- deduplication: remove deduplication key only when jobId matches with the last one being saved (#3236) (192e82c)
Features
[5.49.2](https://github.com/taskforcesh/bullmq/compare/v5.49.1...v5.49.2) (2025-04-21)
Performance Improvements
[5.49.1](https://github.com/taskforcesh/bullmq/compare/v5.49.0...v5.49.1) (2025-04-17)
Bug Fixes
[5.49.0](https://github.com/taskforcesh/bullmq/compare/v5.48.1...v5.49.0) (2025-04-16)
Features
[5.48.1](https://github.com/taskforcesh/bullmq/compare/v5.48.0...v5.48.1) (2025-04-10)
Bug Fixes
[5.48.0](https://github.com/taskforcesh/bullmq/compare/v5.47.3...v5.48.0) (2025-04-08)
Features
[5.47.3](https://github.com/taskforcesh/bullmq/compare/v5.47.2...v5.47.3) (2025-04-08)
Bug Fixes
[5.47.2](https://github.com/taskforcesh/bullmq/compare/v5.47.1...v5.47.2) (2025-04-06)
Bug Fixes
- flow: remove job from dependencies when failParentOnFailure or continueParentOnFailure (#3201) (1fbcbec)
[5.47.1](https://github.com/taskforcesh/bullmq/compare/v5.47.0...v5.47.1) (2025-04-05)
Bug Fixes
[5.47.0](https://github.com/taskforcesh/bullmq/compare/v5.46.1...v5.47.0) (2025-04-04)
Features
[5.46.1](https://github.com/taskforcesh/bullmq/compare/v5.46.0...v5.46.1) (2025-04-03)
Bug Fixes
[5.46.0](https://github.com/taskforcesh/bullmq/compare/v5.45.2...v5.46.0) (2025-04-02)
Features
[5.45.2](https://github.com/taskforcesh/bullmq/compare/v5.45.1...v5.45.2) (2025-03-29)
Bug Fixes
[5.45.1](https://github.com/taskforcesh/bullmq/compare/v5.45.0...v5.45.1) (2025-03-29)
Bug Fixes
[5.45.0](https://github.com/taskforcesh/bullmq/compare/v5.44.4...v5.45.0) (2025-03-27)
Features
- add deduplicated job id to the deduplicated event (0f21c10)
[5.44.4](https://github.com/taskforcesh/bullmq/compare/v5.44.3...v5.44.4) (2025-03-24)
Bug Fixes
[5.44.3](https://github.com/taskforcesh/bullmq/compare/v5.44.2...v5.44.3) (2025-03-22)
Bug Fixes
[5.44.2](https://github.com/taskforcesh/bullmq/compare/v5.44.1...v5.44.2) (2025-03-22)
Performance Improvements
[5.44.1](https://github.com/taskforcesh/bullmq/compare/v5.44.0...v5.44.1) (2025-03-21)
Bug Fixes
[5.44.0](https://github.com/taskforcesh/bullmq/compare/v5.43.1...v5.44.0) (2025-03-18)
Features
- prometheus export: expose global variables (0325a39)
[5.43.1](https://github.com/taskforcesh/bullmq/compare/v5.43.0...v5.43.1) (2025-03-15)
Bug Fixes
[5.43.0](https://github.com/taskforcesh/bullmq/compare/v5.42.0...v5.43.0) (2025-03-13)
Features
[5.42.0](https://github.com/taskforcesh/bullmq/compare/v5.41.9...v5.42.0) (2025-03-12)
Bug Fixes
- flow: consider to fail a parent not in waiting-children when failParentOnFailure is provided (#3098) (589adb4)
- job-scheduler: restore iterationCount attribute (#3134) (eec7114)
Features
Performance Improvements
[5.41.9](https://github.com/taskforcesh/bullmq/compare/v5.41.8...v5.41.9) (2025-03-11)
Bug Fixes
[5.41.8](https://github.com/taskforcesh/bullmq/compare/v5.41.7...v5.41.8) (2025-03-08)
Bug Fixes
- job: deserialize priority in fromJSON (#3126) (c3269b1)
- worker: cast delay_until to integer [python] (#3116) (db617e4)
[5.41.7](https://github.com/taskforcesh/bullmq/compare/v5.41.6...v5.41.7) (2025-02-27)
Bug Fixes
[5.41.6](https://github.com/taskforcesh/bullmq/compare/v5.41.5...v5.41.6) (2025-02-26)
Bug Fixes
- flow: consider delayed state when moving a parent to failed (#3112) (6a28b86)
- telemetry: fix span name for moveToFailed logic (#3113) (7a4b500)
[5.41.5](https://github.com/taskforcesh/bullmq/compare/v5.41.4...v5.41.5) (2025-02-21)
Bug Fixes
[5.41.4](https://github.com/taskforcesh/bullmq/compare/v5.41.3...v5.41.4) (2025-02-21)
Performance Improvements
[5.41.3](https://github.com/taskforcesh/bullmq/compare/v5.41.2...v5.41.3) (2025-02-19)
Bug Fixes
[5.41.2](https://github.com/taskforcesh/bullmq/compare/v5.41.1...v5.41.2) (2025-02-16)
Bug Fixes
[5.41.1](https://github.com/taskforcesh/bullmq/compare/v5.41.0...v5.41.1) (2025-02-15)
Bug Fixes
[5.41.0](https://github.com/taskforcesh/bullmq/compare/v5.40.5...v5.41.0) (2025-02-14)
Features
- job: add moveToWait method for manual processing (#2978) (5a97491)
- queue: support removeGlobalConcurrency method (#3076) (ece8532)
Performance Improvements
[5.40.5](https://github.com/taskforcesh/bullmq/compare/v5.40.4...v5.40.5) (2025-02-14)
Bug Fixes
[5.40.4](https://github.com/taskforcesh/bullmq/compare/v5.40.3...v5.40.4) (2025-02-13)
Bug Fixes
[5.40.3](https://github.com/taskforcesh/bullmq/compare/v5.40.2...v5.40.3) (2025-02-12)
Bug Fixes
- job-scheduler: return undefined in getJobScheduler when it does not exist (#3065) fixes #3062 (548cc1c)
[5.40.2](https://github.com/taskforcesh/bullmq/compare/v5.40.1...v5.40.2) (2025-02-07)
Bug Fixes
- fix return type of getNextJob (b970281)
[5.40.1](https://github.com/taskforcesh/bullmq/compare/v5.40.0...v5.40.1) (2025-02-07)
Bug Fixes
[5.40.0](https://github.com/taskforcesh/bullmq/compare/v5.39.2...v5.40.0) (2025-02-02)
Features
- job-scheduler: revert add delayed job and update in the same script (9f0f1ba)
[5.39.2](https://github.com/taskforcesh/bullmq/compare/v5.39.1...v5.39.2) (2025-02-02)
Bug Fixes
[5.39.1](https://github.com/taskforcesh/bullmq/compare/v5.39.0...v5.39.1) (2025-01-30)
Bug Fixes
[5.39.0](https://github.com/taskforcesh/bullmq/compare/v5.38.0...v5.39.0) (2025-01-29)
Features
[5.38.0](https://github.com/taskforcesh/bullmq/compare/v5.37.0...v5.38.0) (2025-01-28)
Bug Fixes
- flow-producer: add support for skipWaitingForReady (6d829fc)
Features
- queue: add option to skip wait until connection ready (e728299)
[5.37.0](https://github.com/taskforcesh/bullmq/compare/v5.36.0...v5.37.0) (2025-01-25)
Features
- queue-getters: add prometheus exporter (078ae9d)
[5.36.0](https://github.com/taskforcesh/bullmq/compare/v5.35.1...v5.36.0) (2025-01-24)
Features
[5.35.1](https://github.com/taskforcesh/bullmq/compare/v5.35.0...v5.35.1) (2025-01-23)
Bug Fixes
- worker: avoid possible hazard in closing worker (0f07467)
[5.35.0](https://github.com/taskforcesh/bullmq/compare/v5.34.10...v5.35.0) (2025-01-22)
Features
- sandbox: add support for getChildrenValues (dcc3b06)
[5.34.10](https://github.com/taskforcesh/bullmq/compare/v5.34.9...v5.34.10) (2025-01-14)
Bug Fixes
[5.34.9](https://github.com/taskforcesh/bullmq/compare/v5.34.8...v5.34.9) (2025-01-12)
Bug Fixes
[5.34.8](https://github.com/taskforcesh/bullmq/compare/v5.34.7...v5.34.8) (2025-01-08)
Performance Improvements
[5.34.7](https://github.com/taskforcesh/bullmq/compare/v5.34.6...v5.34.7) (2025-01-06)
Performance Improvements
[5.34.6](https://github.com/taskforcesh/bullmq/compare/v5.34.5...v5.34.6) (2024-12-31)
Bug Fixes
[5.34.5](https://github.com/taskforcesh/bullmq/compare/v5.34.4...v5.34.5) (2024-12-25)
Bug Fixes
[5.34.4](https://github.com/taskforcesh/bullmq/compare/v5.34.3...v5.34.4) (2024-12-21)
Bug Fixes
[5.34.3](https://github.com/taskforcesh/bullmq/compare/v5.34.2...v5.34.3) (2024-12-18)
Bug Fixes
[5.34.2](https://github.com/taskforcesh/bullmq/compare/v5.34.1...v5.34.2) (2024-12-14)
Bug Fixes
- scripts: make sure jobs fields are not empty before unpack (4360572)
[5.34.1](https://github.com/taskforcesh/bullmq/compare/v5.34.0...v5.34.1) (2024-12-13)
Bug Fixes
- guarantee every repeatable jobs are slotted (9917df1)
- job-scheduler: avoid duplicated delayed jobs when repeatable jobs are retried (af75315)
[5.34.0](https://github.com/taskforcesh/bullmq/compare/v5.33.1...v5.34.0) (2024-12-10)
Features
[5.33.1](https://github.com/taskforcesh/bullmq/compare/v5.33.0...v5.33.1) (2024-12-10)
Bug Fixes
[5.33.0](https://github.com/taskforcesh/bullmq/compare/v5.32.0...v5.33.0) (2024-12-09)
Features
[5.32.0](https://github.com/taskforcesh/bullmq/compare/v5.31.2...v5.32.0) (2024-12-08)
Features
[5.31.2](https://github.com/taskforcesh/bullmq/compare/v5.31.1...v5.31.2) (2024-12-06)
Bug Fixes
[5.31.1](https://github.com/taskforcesh/bullmq/compare/v5.31.0...v5.31.1) (2024-12-04)
Bug Fixes
[5.31.0](https://github.com/taskforcesh/bullmq/compare/v5.30.1...v5.31.0) (2024-12-02)
Features
[5.30.1](https://github.com/taskforcesh/bullmq/compare/v5.30.0...v5.30.1) (2024-11-30)
Bug Fixes
[5.30.0](https://github.com/taskforcesh/bullmq/compare/v5.29.1...v5.30.0) (2024-11-29)
Bug Fixes
Features
[5.29.1](https://github.com/taskforcesh/bullmq/compare/v5.29.0...v5.29.1) (2024-11-23)
Bug Fixes
[5.29.0](https://github.com/taskforcesh/bullmq/compare/v5.28.2...v5.29.0) (2024-11-22)
Features
- queue: refactor a protected addJob method allowing telemetry extensions (09f2571)
[5.28.2](https://github.com/taskforcesh/bullmq/compare/v5.28.1...v5.28.2) (2024-11-22)
Bug Fixes
[5.28.1](https://github.com/taskforcesh/bullmq/compare/v5.28.0...v5.28.1) (2024-11-20)
Bug Fixes
[5.28.0](https://github.com/taskforcesh/bullmq/compare/v5.27.0...v5.28.0) (2024-11-19)
Features
- job-scheduler: add telemetry support to the job scheduler (72ea950)
[5.27.0](https://github.com/taskforcesh/bullmq/compare/v5.26.2...v5.27.0) (2024-11-19)
Features
- queue: add rateLimit method (#2896) (db84ad5)
- queue: add removeRateLimitKey method (#2806) (ff70613)
Performance Improvements
[5.26.2](https://github.com/taskforcesh/bullmq/compare/v5.26.1...v5.26.2) (2024-11-15)
Bug Fixes
- telemetry: do not set span on parent context if undefined (c417a23)
[5.26.1](https://github.com/taskforcesh/bullmq/compare/v5.26.0...v5.26.1) (2024-11-14)
Bug Fixes
- queue: fix generics to be able to properly be extended (f2495e5)
[5.26.0](https://github.com/taskforcesh/bullmq/compare/v5.25.6...v5.26.0) (2024-11-14)
Features
[5.25.6](https://github.com/taskforcesh/bullmq/compare/v5.25.5...v5.25.6) (2024-11-11)
Bug Fixes
- job-scheculer: avoid hazards when upserting job schedulers concurrently (022f7b7)
[5.25.5](https://github.com/taskforcesh/bullmq/compare/v5.25.4...v5.25.5) (2024-11-11)
Bug Fixes
[5.25.4](https://github.com/taskforcesh/bullmq/compare/v5.25.3...v5.25.4) (2024-11-10)
Bug Fixes
- repeatable: only apply immediately in the first iteration (f69cfbc)
[5.25.3](https://github.com/taskforcesh/bullmq/compare/v5.25.2...v5.25.3) (2024-11-08)
Bug Fixes
[5.25.2](https://github.com/taskforcesh/bullmq/compare/v5.25.1...v5.25.2) (2024-11-08)
Bug Fixes
[5.25.1](https://github.com/taskforcesh/bullmq/compare/v5.25.0...v5.25.1) (2024-11-07)
Bug Fixes
[5.25.0](https://github.com/taskforcesh/bullmq/compare/v5.24.0...v5.25.0) (2024-11-06)
Features
[5.24.0](https://github.com/taskforcesh/bullmq/compare/v5.23.1...v5.24.0) (2024-11-05)
Features
[5.23.1](https://github.com/taskforcesh/bullmq/compare/v5.23.0...v5.23.1) (2024-11-05)
Bug Fixes
[5.23.0](https://github.com/taskforcesh/bullmq/compare/v5.22.0...v5.23.0) (2024-11-02)
Features
[5.22.0](https://github.com/taskforcesh/bullmq/compare/v5.21.2...v5.22.0) (2024-10-31)
Features
[5.21.2](https://github.com/taskforcesh/bullmq/compare/v5.21.1...v5.21.2) (2024-10-22)
Bug Fixes
- proper way to get version (b4e25c1)
[5.21.1](https://github.com/taskforcesh/bullmq/compare/v5.21.0...v5.21.1) (2024-10-18)
Bug Fixes
- scripts: add missing wait in isJobInList (9ef865c)
[5.21.0](https://github.com/taskforcesh/bullmq/compare/v5.20.1...v5.21.0) (2024-10-18)
Features
- queue: add option to skip metas update (b7dd925)
[5.20.1](https://github.com/taskforcesh/bullmq/compare/v5.20.0...v5.20.1) (2024-10-18)
Bug Fixes
- redis: use version for naming loaded lua scripts (fe73f6d)
[5.20.0](https://github.com/taskforcesh/bullmq/compare/v5.19.1...v5.20.0) (2024-10-13)
Features
[5.19.1](https://github.com/taskforcesh/bullmq/compare/v5.19.0...v5.19.1) (2024-10-12)
Bug Fixes
- sandbox: fix serialization of error with circular references are present (#2815) fix #2813 (a384d92)
[5.19.0](https://github.com/taskforcesh/bullmq/compare/v5.18.0...v5.19.0) (2024-10-11)
Features
- repeat: deprecate immediately on job scheduler (ed047f7)
[5.18.0](https://github.com/taskforcesh/bullmq/compare/v5.17.1...v5.18.0) (2024-10-09)
Features
[5.17.1](https://github.com/taskforcesh/bullmq/compare/v5.17.0...v5.17.1) (2024-10-07)
Bug Fixes
- repeat: also consider startDate when using "every" (25bbaa8)
[5.17.0](https://github.com/taskforcesh/bullmq/compare/v5.16.0...v5.17.0) (2024-10-07)
Bug Fixes
Features
[5.16.0](https://github.com/taskforcesh/bullmq/compare/v5.15.0...v5.16.0) (2024-10-06)
Features
- queue: add new upsertJobScheduler, getJobSchedulers and removeJobSchedulers methods (dd6b6b2)
[5.15.0](https://github.com/taskforcesh/bullmq/compare/v5.14.0...v5.15.0) (2024-10-01)
Features
[5.14.0](https://github.com/taskforcesh/bullmq/compare/v5.13.2...v5.14.0) (2024-09-30)
Features
[5.13.2](https://github.com/taskforcesh/bullmq/compare/v5.13.1...v5.13.2) (2024-09-20)
Bug Fixes
[5.13.1](https://github.com/taskforcesh/bullmq/compare/v5.13.0...v5.13.1) (2024-09-18)
Bug Fixes
[5.13.0](https://github.com/taskforcesh/bullmq/compare/v5.12.15...v5.13.0) (2024-09-11)
Features
[5.12.15](https://github.com/taskforcesh/bullmq/compare/v5.12.14...v5.12.15) (2024-09-10)
Bug Fixes
- metrics: differentiate points in different minutes to be more accurate (#2766) (python) (7cb670e)
- pattern: do not save offset when immediately is provided (#2756) (a8cb8a2)
[5.12.14](https://github.com/taskforcesh/bullmq/compare/v5.12.13...v5.12.14) (2024-09-05)
Performance Improvements
[5.12.13](https://github.com/taskforcesh/bullmq/compare/v5.12.12...v5.12.13) (2024-09-03)
Bug Fixes
- repeat: replace delayed job when updating repeat key (88029bb)
[5.12.12](https://github.com/taskforcesh/bullmq/compare/v5.12.11...v5.12.12) (2024-08-29)
Bug Fixes
[5.12.11](https://github.com/taskforcesh/bullmq/compare/v5.12.10...v5.12.11) (2024-08-28)
Bug Fixes
[5.12.10](https://github.com/taskforcesh/bullmq/compare/v5.12.9...v5.12.10) (2024-08-22)
Bug Fixes
[5.12.9](https://github.com/taskforcesh/bullmq/compare/v5.12.8...v5.12.9) (2024-08-17)
Performance Improvements
[5.12.8](https://github.com/taskforcesh/bullmq/compare/v5.12.7...v5.12.8) (2024-08-17)
Bug Fixes
[5.12.7](https://github.com/taskforcesh/bullmq/compare/v5.12.6...v5.12.7) (2024-08-16)
Bug Fixes
- job: throw error if removeDependencyOnFailure and ignoreDependencyOnFailure are used together (#2711) (967632c)
[5.12.6](https://github.com/taskforcesh/bullmq/compare/v5.12.5...v5.12.6) (2024-08-14)
Bug Fixes
- job: change moveToFinished return type to reflect jobData (#2706) ref #2342 (de094a3)
- stalled: support removeDependencyOnFailure option when job is stalled (#2708) (e0d3790)
[5.12.5](https://github.com/taskforcesh/bullmq/compare/v5.12.4...v5.12.5) (2024-08-13)
Bug Fixes
[5.12.4](https://github.com/taskforcesh/bullmq/compare/v5.12.3...v5.12.4) (2024-08-12)
Bug Fixes
[5.12.3](https://github.com/taskforcesh/bullmq/compare/v5.12.2...v5.12.3) (2024-08-10)
Bug Fixes
- flow: validate parentData before ignoreDependencyOnFailure when stalled check happens (#2702) (python) (9416501)
[5.12.2](https://github.com/taskforcesh/bullmq/compare/v5.12.1...v5.12.2) (2024-08-09)
Performance Improvements
[5.12.1](https://github.com/taskforcesh/bullmq/compare/v5.12.0...v5.12.1) (2024-08-07)
Bug Fixes
[5.12.0](https://github.com/taskforcesh/bullmq/compare/v5.11.0...v5.12.0) (2024-08-01)
Features
[5.11.0](https://github.com/taskforcesh/bullmq/compare/v5.10.4...v5.11.0) (2024-07-29)
Features
[5.10.4](https://github.com/taskforcesh/bullmq/compare/v5.10.3...v5.10.4) (2024-07-26)
Bug Fixes
[5.10.3](https://github.com/taskforcesh/bullmq/compare/v5.10.2...v5.10.3) (2024-07-19)
Bug Fixes
- repeatable: keep legacy repeatables if it exists instead of creating one with new structure (#2665) (93fad41)
[5.10.2](https://github.com/taskforcesh/bullmq/compare/v5.10.1...v5.10.2) (2024-07-19)
Performance Improvements
[5.10.1](https://github.com/taskforcesh/bullmq/compare/v5.10.0...v5.10.1) (2024-07-18)
Bug Fixes
- repeatable: consider removing legacy repeatable job (#2658) fixes #2661 (a6764ae)
- repeatable: pass custom key as an args in addRepeatableJob to prevent CROSSSLOT issue (#2662) fixes #2660 (9d8f874)
[5.10.0](https://github.com/taskforcesh/bullmq/compare/v5.9.0...v5.10.0) (2024-07-16)
Features
[5.9.0](https://github.com/taskforcesh/bullmq/compare/v5.8.7...v5.9.0) (2024-07-15)
Features
[5.8.7](https://github.com/taskforcesh/bullmq/compare/v5.8.6...v5.8.7) (2024-07-11)
Performance Improvements
[5.8.6](https://github.com/taskforcesh/bullmq/compare/v5.8.5...v5.8.6) (2024-07-11)
Bug Fixes
[5.8.5](https://github.com/taskforcesh/bullmq/compare/v5.8.4...v5.8.5) (2024-07-10)
Bug Fixes
- parent: consider re-adding child that is in completed state using same jobIds (#2627) (python) fixes #2554 (00cd017)
[5.8.4](https://github.com/taskforcesh/bullmq/compare/v5.8.3...v5.8.4) (2024-07-05)
Bug Fixes
[5.8.3](https://github.com/taskforcesh/bullmq/compare/v5.8.2...v5.8.3) (2024-06-28)
Bug Fixes
[5.8.2](https://github.com/taskforcesh/bullmq/compare/v5.8.1...v5.8.2) (2024-06-15)
Bug Fixes
[5.8.1](https://github.com/taskforcesh/bullmq/compare/v5.8.0...v5.8.1) (2024-06-12)
Bug Fixes
[5.8.0](https://github.com/taskforcesh/bullmq/compare/v5.7.15...v5.8.0) (2024-06-11)
Features
[5.7.15](https://github.com/taskforcesh/bullmq/compare/v5.7.14...v5.7.15) (2024-06-04)
Performance Improvements
[5.7.14](https://github.com/taskforcesh/bullmq/compare/v5.7.13...v5.7.14) (2024-05-29)
Bug Fixes
- worker: properly cancel blocking command during disconnections (2cf12b3)