bullmq Documentation

BullMQ - Message Queue and Batch processing for NodeJS, Python, .NET, Elixir, Rust and PHP based on Redis or PostgreSQL

9,514 stars TypeScript TypeScript 1 file Β· ~129,190 tokens #background-jobs#elixir#nodejs#php#python#queue#redis#rust
RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy bullmq on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name bullmq -p 6379:6379 --restart always redis:8-alpine
Configured Services & Ports
βš™οΈ redis
image: redis:8-alpine
πŸ”Œ Ports: 6379:6379
βš™οΈ dragonfly
image: docker.dragonflydb.io/dragonflydb/dragonfly:v2.0.0
πŸ”Œ Ports: 6380:6379
βš™οΈ postgres
image: postgres:18-alpine
πŸ”Œ Ports: ${POSTGRES_PORT:-5432}:5432
βš™οΈ redis-cluster-node-1
image: redis:8-alpine
πŸ”Œ Ports: 7001:7001, 17001:17001
βš™οΈ redis-cluster-node-2
image: redis:8-alpine
πŸ”Œ Ports: 7002:7002, 17002:17002
βš™οΈ redis-cluster-node-3
image: redis:8-alpine
πŸ”Œ Ports: 7003:7003, 17003:17003
βš™οΈ redis-cluster-node-4
image: redis:8-alpine
πŸ”Œ Ports: 7004:7004, 17004:17004
βš™οΈ redis-cluster-node-5
image: redis:8-alpine
πŸ”Œ Ports: 7005:7005, 17005:17005
βš™οΈ redis-cluster-node-6
image: redis:8-alpine
πŸ”Œ Ports: 7006:7006, 17006:17006
βš™οΈ redis-cluster-init
image: redis:8-alpine
βš™οΈ redis-cluster-auth-node-1
image: redis:8-alpine
πŸ”Œ Ports: 7101:7101, 17101:17101
βš™οΈ redis-cluster-auth-node-2
image: redis:8-alpine
πŸ”Œ Ports: 7102:7102, 17102:17102
βš™οΈ redis-cluster-auth-node-3
image: redis:8-alpine
πŸ”Œ Ports: 7103:7103, 17103:17103
βš™οΈ redis-cluster-auth-node-4
image: redis:8-alpine
πŸ”Œ Ports: 7104:7104, 17104:17104
βš™οΈ redis-cluster-auth-node-5
image: redis:8-alpine
πŸ”Œ Ports: 7105:7105, 17105:17105
βš™οΈ redis-cluster-auth-node-6
image: redis:8-alpine
πŸ”Œ Ports: 7106:7106, 17106:17106
βš™οΈ redis-cluster-auth-init
image: redis:8-alpine
docker-compose.yml
yaml (docker-compose.yml)
version: '3.2'
services:
  redis:
    image: redis:8-alpine
    container_name: cache
    ports:
      - 6379:6379
  dragonfly:
    image: 'docker.dragonflydb.io/dragonflydb/dragonfly:v2.0.0'
    ports:
      - '6380:6379'
    environment:
      DFLY_cluster_mode: 'emulated'
      DFLY_lock_on_hashtags: 'true'
      DFLY_default_lua_flags: 'allow-undeclared-keys'
      HEALTHCHECK_PORT: 6379

  # PostgreSQL backend for `yarn test:postgres` / `yarn test:postgres:smoke`.
  # Image and credentials match the CI service in .github/workflows/test.yml,
  # and the database/port match the default POSTGRES_URL the tests fall back to
  # (postgres://postgres:[email protected]:5432/bullmq_test), so no env var is
  # needed locally. Storage is intentionally ephemeral β€” every run migrates
  # from scratch and the suites drop their schemas.
  #
  # If something else already listens on 5432, publish another host port with
  # `POSTGRES_PORT=5433 yarn dc:up` and point the tests at it with
  # `POSTGRES_URL=postgres://postgres:[email protected]:5433/bullmq_test`.
  postgres:
    image: postgres:18-alpine
    container_name: bullmq-postgres
    ports:
      - ${POSTGRES_PORT:-5432}:5432
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: bullmq_test
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres -d bullmq_test']
      interval: 10s
      timeout: 5s
      retries: 5

  # Redis Cluster for integration tests
  # Note: On macOS, use `docker-compose --profile cluster up` to start the cluster
  # Uses static IPs in a custom subnet; client must use NAT mapping for 172.30.0.x -> 127.0.0.1
  redis-cluster-node-1:
    image: redis:8-alpine
    container_name: redis-cluster-node-1
    profiles: ['cluster']
    command:
      [
        'redis-server',
        '--port',
        '7001',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7001:7001'
      - '17001:17001'
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.11

  redis-cluster-node-2:
    image: redis:8-alpine
    container_name: redis-cluster-node-2
    profiles: ['cluster']
    command:
      [
        'redis-server',
        '--port',
        '7002',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7002:7002'
      - '17002:17002'
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.12

  redis-cluster-node-3:
    image: redis:8-alpine
    container_name: redis-cluster-node-3
    profiles: ['cluster']
    command:
      [
        'redis-server',
        '--port',
        '7003',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7003:7003'
      - '17003:17003'
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.13

  redis-cluster-node-4:
    image: redis:8-alpine
    container_name: redis-cluster-node-4
    profiles: ['cluster']
    command:
      [
        'redis-server',
        '--port',
        '7004',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7004:7004'
      - '17004:17004'
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.14

  redis-cluster-node-5:
    image: redis:8-alpine
    container_name: redis-cluster-node-5
    profiles: ['cluster']
    command:
      [
        'redis-server',
        '--port',
        '7005',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7005:7005'
      - '17005:17005'
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.15

  redis-cluster-node-6:
    image: redis:8-alpine
    container_name: redis-cluster-node-6
    profiles: ['cluster']
    command:
      [
        'redis-server',
        '--port',
        '7006',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7006:7006'
      - '17006:17006'
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.16

  # Initializes the Redis cluster after nodes are up
  redis-cluster-init:
    image: redis:8-alpine
    container_name: redis-cluster-init
    profiles: ['cluster']
    depends_on:
      - redis-cluster-node-1
      - redis-cluster-node-2
      - redis-cluster-node-3
      - redis-cluster-node-4
      - redis-cluster-node-5
      - redis-cluster-node-6
    command:
      [
        'sh',
        '-c',
        'sleep 5 && redis-cli --cluster create 172.30.0.11:7001 172.30.0.12:7002 172.30.0.13:7003 172.30.0.14:7004 172.30.0.15:7005 172.30.0.16:7006 --cluster-replicas 1 --cluster-yes',
      ]
    networks:
      redis-cluster-net:
        ipv4_address: 172.30.0.10

  # Redis Cluster with Authentication for integration tests
  # Use `docker-compose --profile cluster-auth up` to start
  redis-cluster-auth-node-1:
    image: redis:8-alpine
    container_name: redis-cluster-auth-node-1
    profiles: ['cluster-auth']
    command:
      [
        'redis-server',
        '--port',
        '7101',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
        '--requirepass',
        'testpassword',
        '--masterauth',
        'testpassword',
      ]
    ports:
      - '7101:7101'
      - '17101:17101'
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.11

  redis-cluster-auth-node-2:
    image: redis:8-alpine
    container_name: redis-cluster-auth-node-2
    profiles: ['cluster-auth']
    command:
      [
        'redis-server',
        '--port',
        '7102',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
        '--requirepass',
        'testpassword',
        '--masterauth',
        'testpassword',
      ]
    ports:
      - '7102:7102'
      - '17102:17102'
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.12

  redis-cluster-auth-node-3:
    image: redis:8-alpine
    container_name: redis-cluster-auth-node-3
    profiles: ['cluster-auth']
    command:
      [
        'redis-server',
        '--port',
        '7103',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
        '--requirepass',
        'testpassword',
        '--masterauth',
        'testpassword',
      ]
    ports:
      - '7103:7103'
      - '17103:17103'
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.13

  redis-cluster-auth-node-4:
    image: redis:8-alpine
    container_name: redis-cluster-auth-node-4
    profiles: ['cluster-auth']
    command:
      [
        'redis-server',
        '--port',
        '7104',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
        '--requirepass',
        'testpassword',
        '--masterauth',
        'testpassword',
      ]
    ports:
      - '7104:7104'
      - '17104:17104'
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.14

  redis-cluster-auth-node-5:
    image: redis:8-alpine
    container_name: redis-cluster-auth-node-5
    profiles: ['cluster-auth']
    command:
      [
        'redis-server',
        '--port',
        '7105',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
        '--requirepass',
        'testpassword',
        '--masterauth',
        'testpassword',
      ]
    ports:
      - '7105:7105'
      - '17105:17105'
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.15

  redis-cluster-auth-node-6:
    image: redis:8-alpine
    container_name: redis-cluster-auth-node-6
    profiles: ['cluster-auth']
    command:
      [
        'redis-server',
        '--port',
        '7106',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
        '--requirepass',
        'testpassword',
        '--masterauth',
        'testpassword',
      ]
    ports:
      - '7106:7106'
      - '17106:17106'
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.16

  # Initializes the authenticated Redis cluster
  redis-cluster-auth-init:
    image: redis:8-alpine
    container_name: redis-cluster-auth-init
    profiles: ['cluster-auth']
    depends_on:
      - redis-cluster-auth-node-1
      - redis-cluster-auth-node-2
      - redis-cluster-auth-node-3
      - redis-cluster-auth-node-4
      - redis-cluster-auth-node-5
      - redis-cluster-auth-node-6
    command:
      [
        'sh',
        '-c',
        'sleep 5 && redis-cli -a testpassword --cluster create 172.31.0.11:7101 172.31.0.12:7102 172.31.0.13:7103 172.31.0.14:7104 172.31.0.15:7105 172.31.0.16:7106 --cluster-replicas 1 --cluster-yes',
      ]
    networks:
      redis-cluster-auth-net:
        ipv4_address: 172.31.0.10

networks:
  redis-cluster-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16
  redis-cluster-auth-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.31.0.0/16

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:

text
$ yarn add bullmq

If 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:

ts
import { Queue } from 'bullmq';

const queue = new Queue('Paint');

queue.add('cars', { color: 'blue' });

Process the jobs in your workers:

ts
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:

ts
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:

ts
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-level Queue,
Worker and Job classes run on either backend β€” select PostgreSQL by
setting Postgres on the options. FlowProducer, QueueEvents and
JobScheduler are 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

bash
dotnet add package BullMQ

Quick start

csharp
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):

csharp
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.

csharp
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 into
dotnet/src/BullMQ/Postgres/. These copies are generated and git-ignored.

From the repository root:

bash
# 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:6379

Or 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):

bash
cd dotnet
./scripts/test.sh                      # whole suite (Redis + PostgreSQL)
./scripts/test.sh --filter Name~Flow   # a subset

Set 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:

elixir
def deps do
  [
    {:bullmq, "~> 1.0"}
  ]
end

If you want to use the PostgreSQL backend, add :postgrex in your application too:

elixir
def deps do
  [
    {:bullmq, "~> 1.0"},
    {:postgrex, "~> 0.22"}
  ]
end

Backend 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, ...
elixir
# config/config.exs
config :bullmq, :backend, BullMQ.Backends.Redis
elixir
# 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/*.sql
  • src/postgres/commands/*.sql

This keeps behavior aligned across runtimes while avoiding SQL forks.
In Hex packages and Mix releases, BullMQ reads these SQL files from
elixir/priv/postgres; when running from this repository during development, it
falls back to src/postgres. Migrations are applied automatically by
BullMQ.Backends.Postgres.Connection.start_link/1.

PostgreSQL setup

elixir
{:ok, _conn} =
  BullMQ.Backends.Postgres.Connection.start_link(
    name: :my_pg,
    url: "postgresql://localhost:5432/bullmq",
    schema: "bullmq"
  )

Then use the backend explicitly:

elixir
{: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

elixir
# 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

elixir
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

elixir
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
end

Advanced Features

Job Options

elixir
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:

elixir
{: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:

elixir
{: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}")
end

Rate Limiting

elixir
{: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)

elixir
# 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

elixir
def process(%BullMQ.Job{} = job) do
  Enum.each(1..100, fn i ->
    do_work(i)
    BullMQ.Worker.update_progress(job, i)
  end)

  {:ok, "done"}
end

Queue Getters

elixir
# 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 | :failed

Queue Operations

elixir
# 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:

elixir
# 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:

bash
# 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

Download the latest release from the releases page (look for bullmq-php-X.X.X.zip), extract it to your project, and configure Composer:

json
{
  "repositories": [
    {
      "type": "path",
      "url": "./bullmq-php-X.X.X"
    }
  ],
  "require": {
    "taskforcesh/bullmq-php": "*"
  }
}

Then run:

bash
composer install

Option 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.

json
{
  "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:

bash
cd vendor/taskforcesh/bullmq-php
# From the monorepo root:
yarn install
yarn build
yarn copy:lua:php

Note: 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

php
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

php
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

php
// 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

php
$jobs = $queue->addBulk([
    ['name' => 'email', 'data' => ['to' => '[email protected]']],
    ['name' => 'email', 'data' => ['to' => '[email protected]']],
    ['name' => 'email', 'data' => ['to' => '[email protected]']],
]);

Getting Job Information

php
// 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

php
// 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)

php
// 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 processed
  • active - Job is currently being processed
  • delayed - Job is delayed and waiting for its delay to expire
  • completed - Job has been successfully processed
  • failed - Job has failed after all retry attempts
  • paused - Job is in a paused queue
  • prioritized - Job is in the prioritized set
  • waiting-children - Parent job waiting for child jobs to complete

Connection Options

php
// 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:

Example Node.js worker:

javascript
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

php
use BullMQ\Queue;

try {
    $queue = new Queue('my-queue');
    $job = $queue->add('task', $data);
} catch (\RuntimeException $e) {
    echo "Error: " . $e->getMessage() . "\n";
}

Testing

bash
composer test

License

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.


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:

Installation

bash
pip install bullmq

Usage

Basic Example

python
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 of
0 (the default) means "no priority" and jobs are processed in FIFO order.

python
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:

python
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 (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-job size_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_flow and
    per-queue default options.
  • JobScheduler β€” Cron/interval repeatable jobs (managed via the Queue API).
  • 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

rust
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:

rust
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

bash
# 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 test

Architecture

text
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

  1. Idiomatic Rust β€” Uses async/await, Arc for sharing, tokio for concurrency, thiserror for errors.
  2. FFI-friendly β€” All public types are Send + Sync. The ProcessorFn is a simple trait object that can be wrapped for C FFI.
  3. Compatible β€” Uses the exact same Lua scripts as Node.js BullMQ, ensuring full wire compatibility.
  4. 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:

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:

typescript
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:

typescript
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.

bash
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.

typescript
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:

typescript
BullModule.registerQueue({
  name: 'queueName',
});

To register a flow producer, import the BullModule.registerFlowProducer() dynamic module, as follows:

typescript
BullModule.registerFlowProducer({
  name: 'flowProducerName',
});

Processor

To register a processor, you may need to use Processor decorator:

typescript
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:

typescript
@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:


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:

typescript
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:

typescript
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:

typescript
import { Queue } from 'bullmq';

const myQueue = new Queue('Paint');

myQueue.on('waiting', (job: Job) => {
  // Job is waiting to be processed.
});
typescript
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:

typescript
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.

typescript
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:

typescript
await job.updateProgress({ completed: 3, total: 10 });

Close QueueEvents on shutdown so its Redis connection is released:

typescript
await queueEvents.close();

{% hint style="info" %}
For jobs processed with BullMQ Pro batches,
worker-local completed / failed listeners see the wrapper batch job. Use
QueueEvents / 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" %}

typescript
import { Queue } from 'bullmq';

const queue = new Queue('paint');

await queue.trimEvents(10); // leaves 10 events

{% endtab %}

{% tab title="Python" %}

python
from bullmq import Queue

queue = Queue('paint')

await queue.trimEvents(10) # leaves 10 events

{% endtab %}

{% tab title="Rust" %}

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:


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:

typescript
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" %}

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" %}

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" %}

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" %}

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" %}

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" %}

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:

typescript
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" %}

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" %}

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" %}

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:

typescript
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:

typescript
// 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:

typescript
const { failed, ignored, processed, unprocessed } =
  await job.getDependenciesCount();

Or if you want to be specific:

typescript
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:

typescript
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:

typescript
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.

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,
      },
    ],
  },
  {
    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:

  1. If a parent job is removed, all its children will also be removed.
  2. 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.
  3. 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.
  4. 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:

typescript
await job.remove();
// or
await queue.remove(job.id);

Read more:


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:

typescript
// 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 legacy utc option).

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:

typescript
// 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:


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:

typescript
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:

typescript
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:


Overview (`docs/gitbook/guide/nestjs/README.md`)

There is a compatible module to be used in NestJs.

bash
npm i @nestjs/bullmq

Once the installation process is complete, we can import the BullModule into the root AppModule.

typescript
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:

typescript
BullModule.registerQueue({
  name: 'queueName',
});

To register a flow producer, import the BullModule.registerFlowProducer() dynamic module, as follows:

typescript
BullModule.registerFlowProducer({
  name: 'flowProducerName',
});

Processor

To register a processor, you may need to use the Processor decorator:

typescript
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:

typescript
@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:


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:

typescript
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:

typescript
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:

typescript
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:


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`)


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:


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.

typescript
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:

typescript
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:

typescript
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:

typescript
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:

typescript
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:

typescript
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:

typescript
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:

typescript
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:

typescript
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:

typescript
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:

text
npm add --save bullmq-otel

This 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:

typescript
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"),
});
typescript
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

Patterns

BullMQ Pro

Bull

Python

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

  • valkey-glide: route INFO to a single node in cluster mode (#4891) (d47e42b)

[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

  • deps: upgrade cron-parser to v5.10.2 [security] (#4896) (f838e24)

[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

  • worker: stop infinite connection-error retries during shutdown (#4833) (96e0a96)

[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

  • postgres: retry the LISTEN connection after a failed connect (#4781) (48a550b), closes #4729

[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

  • bun: allow nested duplicate() on lazy Bun adapter (#4723) (438a1d8)

[6.3.5](https://github.com/taskforcesh/bullmq/compare/v6.3.4...v6.3.5) (2026-09-14)

Bug Fixes

  • deps: update dependency cron-parser to v5.10.1 (#4738) (d4b0414)

[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

  • postgres: forward :ssl option to Postgrex connection (#4631) (elixir) (bb569b8)

[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

  • types: add generic ProgressType parameter to Job and Worker (#4529) fixes #3721 (c06b51c)

[6.1.2](https://github.com/taskforcesh/bullmq/compare/v6.1.1...v6.1.2) (2026-08-16)

Bug Fixes

  • deps: update security patches [security] (#4566) (cb37233)

[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

  • postgres: make schema migrations explicit (#4544) (ee714dc)

[6.0.11](https://github.com/taskforcesh/bullmq/compare/v6.0.10...v6.0.11) (2026-08-10)

Bug Fixes

  • deps: update security patches [security] (#4539) (48c5426)

[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

  • events: type completed event returnvalue as deserialized value (#4441) fixes #4147 (5910ccc)

[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

  • worker: recover blocking reads that never settle after a reconnect fixes #4479 (#4484) (e7e9a64)

[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

  • deps: update security patches [security] (#4444) (c1cf328)

[6.0.3](https://github.com/taskforcesh/bullmq/compare/v6.0.2...v6.0.3) (2026-07-31)

Bug Fixes

  • postgres: drop redundant bullmq_ prefix from schema objects (#4436) (elixir) (python) (067a73f)

[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:

text
$ npm install bullmq

Install using yarn:

text
$ 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:

typescript
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:

typescript
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:

typescript
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:

typescript
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".

typescript
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:

  1. move_to_active β†’ commit (job becomes locked and visible as active)
  2. processor runs (user side effects, in the user's own transaction)
  3. 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:

elixir
# 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
    stays active and locked β†’ reclaimed β†’ clean retry. No partial side effects,
    so no idempotence needed.
  • Lock expired mid-processing (slow job): move_to_completed detects 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

  1. Pool sizing. A transactional job holds a dedicated connection for its
    entire duration; concurrency is then bounded by pool_size and long jobs pin
    connections. Requires pool_size β‰₯ in-flight transactional jobs. This is the
    main operational trade-off vs Redis (which releases connections between ops).
  2. Ecto integration. Trivial if the processor uses the raw Postgrex conn we
    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.
  3. 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.
  4. fetch_next fast 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.
  5. Lock renewal. Fine as-is: extend_lock runs 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:

  1. The Node process running your job processor unexpectedly terminates.
  2. 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 lockDuration setting (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:

bash
npm install bull --save

or Yarn:

bash
yarn add bull

In 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

bash
npm install @types/bull --save-dev
bash
yarn add --dev @types/bull

Definitions 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**

text
/* Detailed source-code truncated for AI context efficiency. */

**Using promises**

Alternatively, you can use return promises instead of using the done callback:

javascript
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:

javascript
// processor.js
module.exports = function (job) {
  // Do some heavy work

  return Promise.resolve(result);
}

And define the processor like this:

javascript
// 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:

javascript
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):

javascript
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...

javascript
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.

javascript
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:

javascript
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:

typescript
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:

typescript
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.

typescript
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.
  • minSize and timeout support. When groupAffinity is enabled, minSize applies to the next group in rotation: the worker waits until that group has at least minSize jobs before fetching a batch. The timeout option works as usualβ€”if minSize is 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:

typescript
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:

typescript
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:

typescript
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:

typescript
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

  • queue: add ttlSeconds option to group concurrency and global concurrency (#495) (d94a67a)

[7.48.4](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.3...v7.48.4) (2026-10-14)

Bug Fixes

  • batch: record bullmq.jobs.completed otel metric (#490) (aab1eee)

[7.48.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.2...v7.48.3) (2026-09-26)

Bug Fixes

  • worker: keep group options in job scheduler iterations (#478) (64eef76)

[7.48.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.48.1...v7.48.2) (2026-09-25)

Bug Fixes

[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

  • groups: pass group opts on moveToDelayed fetch-next path to enforce concurrency (#463) (cbc0026)

[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

  • queue: fix an off-by-one when computing the prioritized set range in getGroupJobs (#462) (c158cc6)

[7.46.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.2...v7.46.3) (2026-08-07)

Bug Fixes

  • queue: consider prioritized jobs when calling getGroupsByStatus method (#455) (083a8d7)

[7.46.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.1...v7.46.2) (2026-06-19)

Bug Fixes

  • batches: avoid immediate wakeups without timeout (#437) (3f05f59)

[7.46.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.46.0...v7.46.1) (2026-06-04)

Bug Fixes

  • queue: consider groups when using removeOphanedJobs method (#432) (c191e6b)

[7.46.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.45.1...v7.46.0) (2026-05-21)

Features

  • add support for both group concurrency and group rate limit (#428) (ede5aa3)

[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

  • groups: extend obliterate logic to consider groups (#410) (a186efb)

[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)

  • utils: use exact import of DatabaseType (#3786) (d249301)

  • 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

  • job-scheduler-pro: consider group option in template option (#405) (4c936ca)

[7.42.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.41.1...v7.42.0) (2026-01-28)

Bug Fixes

Features

  • job: add job name and id as telemetry attributes in complete, retry, delay and failed spans (#3707) ref #3692 (6294b36)

Performance Improvements

  • job: apply limit when removing jobs by max age (python) (elixir) (#3694) fixes #3672 (a8fc316)

[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

Performance Improvements

  • worker: promote delayed jobs while queue is rate limited (#3561) (a474801)

[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

  • job-scheduler: changing every in upsert resets the iterations (#3551) (b4c7c65)

[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

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

[7.39.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.39.0...v7.39.1) (2025-09-20)

Bug Fixes

  • scripts: detect missing transformed scripts (#371) (006b394)

[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

  • includes: replace missing base includes with pro (#368) (e51bb10)

[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

  • groups: use rate limit delay as blockTimeout when is lower than delayed marker (#353) (9936325)

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

  • worker: allow calling moveToWait when job is processing (#3302) ref #3296 (e742511)

Performance Improvements

  • scheduler: save offset value when every is provided (#3142) (98f35bc)

[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

  • stalled: fail stalled jobs in a lazy way (#3266) (5cbf064)

[7.35.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.35.1...v7.35.2) (2025-05-23)

Bug Fixes

  • groups: use correct local concurrency attribute name (#343) (712d263)

[7.35.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.35.0...v7.35.1) (2025-05-16)

Bug Fixes

[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

Performance Improvements

  • flow: change parent failure in a lazy way (#3228) (6b37a37)

[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

  • worker-pro: fix return typing in getNextJob method (#305) (ee43930)

[7.32.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.31.1...v7.32.0) (2025-03-05)

Features

  • group: support removing custom group rate limit (#299) (685eec1)

[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

  • job-scheduler: consider removing current job from wait, paused or prioritized (#3066) (97cd2b1)

Performance Improvements

  • delayed: add marker once when promoting delayed jobs (#3096) (python) (38912fb)

[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

  • add-job: add job into wait or prioritized state when delay is provided as 0 (#3052) (3e990eb)

[7.30.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.1...v7.30.2) (2025-02-20)

Bug Fixes

  • worker: wait fetched jobs to be processed when closing (#3059) (d4de2f5)

[7.30.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.30.0...v7.30.1) (2025-02-20)

Bug Fixes

  • job: save processedBy attribute when preparing for processing (#300) (c947f6e)

[7.30.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.29.0...v7.30.0) (2025-02-19)

Features

  • groups: support local limiter options (#262) (fed293c)

[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

  • worker: add missing otel trace when extending locks (#290) (efbf948)

[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

  • retry-job: pass stalled key instead of limiter (#291) (e981c69)

[7.26.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.26.2...v7.26.3) (2025-01-26)

Bug Fixes

  • queue: use same telemetry logic in add method as BullMQ (#287) (214c0d9)

[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

  • queue: enhance getJobSchedulers method to include template information (#2956) ref #2875 (5b005cd)

[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

  • stalled: move parent to group when needed (#276) (8449a41)

[7.23.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.22.0...v7.23.0) (2024-11-26)

Bug Fixes

  • scheduler: remove deprecation warning on immediately option (#2923) (14ca7f4)

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

  • marker: add base markers while consuming jobs to get workers busy (#2904) fixes #2842 (1759c8b)

[7.21.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.21.0...v7.21.1) (2024-11-15)

Bug Fixes

  • deps: use fixed version of bullmq v5.26.1 (#269) (33e73e4)

[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

  • deps: bump msgpackr to 1.1.2 to resolve ERR_BUFFER_OUT_OF_BOUNDS error (#2882) ref #2747 (4d2136c)

Features

[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

  • queue: add option to skip metas update (b7dd925)
  • queue: add queue version support (#2822) (3a4781b)

[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

  • worker-pro: use JobPro as part of WorkerProListener events (#260) (966ac9c)

[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

  • metrics: save zeros as much as max data points (#2758) (3473054)

[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

[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

  • fifo-queue: use linked list structure for queue (#2629) (df74578)

[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

  • queue-pro: add getGroupRateLimitTtl method (#250) (5a907d9)

Performance Improvements

  • worker: promote delayed jobs while queue is rate limited (#2697) ref #2582 (f3290ac)

[7.14.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.14.0...v7.14.1) (2024-08-09)

Bug Fixes

  • flow: get groupId from moveToWaitingChildren script (#247) (1bee26e)

[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

  • groups: add getCountsPerPriorityForGroup method (#241) ref #238 (2d3c81c)

[7.10.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.10.0...v7.10.1) (2024-07-09)

Bug Fixes

  • get-groups-count: consider other group states apart of waiting (#240) (eccd4e6)

[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

  • job: set processedBy using hmset (#2592) (python) (238680b)

[7.9.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.9.1...v7.9.2) (2024-06-28)

Bug Fixes

  • groups: promote maxed groups after decreasing active count (#234) (545b6c2)

[7.9.1](https://github.com/taskforcesh/bullmq-pro/compare/v7.9.0...v7.9.1) (2024-06-18)

Bug Fixes

  • maxed: consider passing max concurrency into repairMaxedGroup (#232) (a3885a5)

[7.9.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.8.3...v7.9.0) (2024-06-15)

Features

  • groups: allow passing limit when calling getGroupsJobsCount (#230) (ac0469f)

[7.8.3](https://github.com/taskforcesh/bullmq-pro/compare/v7.8.2...v7.8.3) (2024-06-13)

Bug Fixes

  • groups: consider removing job from prioritized group when using remove method (#229) (b61b96f)

[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

  • groups: remove concurrency when removing group (#226) (332728e)

[7.8.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.7.2...v7.8.0) (2024-05-10)

Features

  • group: add getGroupConcurrency method (#224) (88e334e)

[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

  • worker: do not call bzpopmin when blockDelay is lower or equal 0 (#2544) ref #2466 (9760b85)

[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

  • groups: support for local group concurrency using setGroupConcurrency method (#220) (159a341)

[7.6.2](https://github.com/taskforcesh/bullmq-pro/compare/v7.6.1...v7.6.2) (2024-04-25)

Bug Fixes

  • stalled: consider ignoreDependencyOnFailure option (python) (#2540) fixes #2531 (0140959)

[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

  • worker: reset delays after generating blockTimeout value (#2529) (e92cea4)

[7.6.0](https://github.com/taskforcesh/bullmq-pro/compare/v7.5.0...v7.6.0) (2024-04-17)

Features

  • queue: add getGroupActiveCount method (#217) (d59d2e5)

[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

  • deps: remove script loader from dist (#213) (dd28ec8)

[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

  • group-limit: set rate limiting even when group is empty (#212) (08824cf)

[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

  • flow: add ignoreDependencyOnFailure option (#2426) (c7559f4)

[7.0.0](https://github.com/taskforcesh/bullmq-pro/compare/v6.11.0...v7.0.0) (2024-03-12)

Bug Fixes

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


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:

text
@taskforcesh:registry=https://npm.taskforce.sh/
//npm.taskforce.sh/:_authToken=${NPM_TASKFORCESH_TOKEN}
always-auth=true

where 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:

text
yarn add @taskforcesh/bullmq-pro

In 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:

typescript
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:

docker
WORKDIR /app

ADD .npmrc /app/.npmrc

Gitbook 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:

typescript
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:

typescript
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

  • script-loader: use cache to read script once (#1410) (f956e93)

[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

  • revert "chore: allow esm imports through exports field" (#1388) (8e51272)

[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

  • revert "feat(sandbox): experimental support ESM" (#1384) (7d180eb)

[1.88.1](https://github.com/taskforcesh/bullmq/compare/v1.88.0...v1.88.1) (2022-08-17)

Bug Fixes

[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

  • move-parent-to-wait: emit waiting instead of active event (#1356) (53578dd)

[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

  • flow: consider priority when parent is moved (#1286) (d49760d)

[1.86.10](https://github.com/taskforcesh/bullmq/compare/v1.86.9...v1.86.10) (2022-07-29)

Performance Improvements

  • clean-jobs-in-set: use ZRANGEBYSCORE when limit > 0 (#1338) (f0d9985)

[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

  • promote: consider empty queue when paused (#1335) (9f742e8)

[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

  • parent: emit waiting event when no pending children (#1296) (aa8fa3f)

[1.86.3](https://github.com/taskforcesh/bullmq/compare/v1.86.2...v1.86.3) (2022-06-26)

Bug Fixes

  • avoid calling delay() if queue is being closed (#1295) (52a5045)

[1.86.2](https://github.com/taskforcesh/bullmq/compare/v1.86.1...v1.86.2) (2022-06-16)

Bug Fixes

  • queue: get rid of repeat options from defaultJobOptions (#1284) (cdd2a20)

[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

  • error-prototype: define custom name for toJSON method (#1272) (66d80da)

[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

  • job: save finishedOn attribute on instance (#1267) (4cf6a63)

[1.85.1](https://github.com/taskforcesh/bullmq/compare/v1.85.0...v1.85.1) (2022-05-31)

Performance Improvements

  • remove-job: send prefix key instead of jobKey (#1252) (452856a)

[1.85.0](https://github.com/taskforcesh/bullmq/compare/v1.84.1...v1.85.0) (2022-05-30)

Features

  • worker: change the number of concurrent processes (#1256) ref #22 (940dc8f)

[1.84.1](https://github.com/taskforcesh/bullmq/compare/v1.84.0...v1.84.1) (2022-05-27)

Bug Fixes

  • waiting-children: pass right timestamp value in moveToWaitingChildren (#1260) (0f993f7)

[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

  • get-workers: use blockingConnection client to set clientName (#1255) fixes #1254 (df796bd)

[1.83.0](https://github.com/taskforcesh/bullmq/compare/v1.82.3...v1.83.0) (2022-05-20)

Features

  • flow-producer: easier to build extension (#1250) (aaf637e)

[1.82.3](https://github.com/taskforcesh/bullmq/compare/v1.82.2...v1.82.3) (2022-05-19)

Bug Fixes

[1.82.2](https://github.com/taskforcesh/bullmq/compare/v1.82.1...v1.82.2) (2022-05-17)

Bug Fixes

  • job: add job helper attribute for extension (#1242) (4d7ae9e)

[1.82.1](https://github.com/taskforcesh/bullmq/compare/v1.82.0...v1.82.1) (2022-05-16)

Bug Fixes

  • remove-job: pass right prev param in removed event (#1237) (54df47e)

[1.82.0](https://github.com/taskforcesh/bullmq/compare/v1.81.4...v1.82.0) (2022-05-11)

Features

  • remove-repeatable: return boolean depending on job existence (#1239) ref #1235 (59b0da7)

[1.81.4](https://github.com/taskforcesh/bullmq/compare/v1.81.3...v1.81.4) (2022-05-05)

Bug Fixes

  • repeatable: emit removed event when removing (#1229) (7d2de8d)

[1.81.3](https://github.com/taskforcesh/bullmq/compare/v1.81.2...v1.81.3) (2022-05-04)

Bug Fixes

  • remove-parent: check removed record from waiting-children (#1227) (e7b25d0)

[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

  • job: delete token when moving to delayed (#1208) (37acf41)

[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

  • job: remove Error from Promise return in moveToWaitingChildren (#1197) (180a8bf)

[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

  • connection: remove Queue reconnect overrides (#1119) (83f1c79)

[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

  • clean: consider processedOn and finishedOn attributes (#1158) (8c3cb72)

[1.78.1](https://github.com/taskforcesh/bullmq/compare/v1.78.0...v1.78.1) (2022-03-24)

Bug Fixes

  • queue: close repeat connection when calling close (#1154) (7d79616)

[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

  • clean: speed up clean operation using deletion marker (#1144) (5fb32ef)

[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

  • queue: sanitize job types in getJobs and getJobsCount (#1113) fixes #1112 (d452b29)

[1.76.4](https://github.com/taskforcesh/bullmq/compare/v1.76.3...v1.76.4) (2022-03-13)

Performance Improvements

  • move-to-finished: avoid an extra roundtrip when using rate limit (#1131) (1711547)

[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

  • get-waiting-children-count: consider waiting-children status only (#1117) (1820df7)

[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

  • rate-limiter: move job to wait after retry when groupKey is missed (#1103) fixes #1084 (8aeab37)

[1.75.0](https://github.com/taskforcesh/bullmq/compare/v1.74.3...v1.75.0) (2022-02-24)

Bug Fixes

  • cluster: check for host presence in Upstash validation (#1102) fixes #1101 (54d4eac)

Features

  • retry-jobs: allow to retry completed jobs (#1082) (e17b3f2)

[1.74.3](https://github.com/taskforcesh/bullmq/compare/v1.74.2...v1.74.3) (2022-02-24)

Bug Fixes

  • connection: throw error when Upstash host is provided (#1098) fixes #1087 (5156d0a)

[1.74.2](https://github.com/taskforcesh/bullmq/compare/v1.74.1...v1.74.2) (2022-02-23)

Bug Fixes

  • move-to-finished: increment attemptsMade when moving job to active (#1095) fixes #1094 (321b0e1)

[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

[1.72.0](https://github.com/taskforcesh/bullmq/compare/v1.71.0...v1.72.0) (2022-02-15)

Features

  • backoff: validate UnrecoverableError presence (#1074) (1defeac)

[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

  • clean: consider checking parent jobs when cleaning (#1048) (0708a24)

[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

  • remove-parent-dependency: do not emit wait event in hard deletions (#1045) (4069821)

[1.68.1](https://github.com/taskforcesh/bullmq/compare/v1.68.0...v1.68.1) (2022-02-01)

Bug Fixes

  • update: throw error when missing job key (#1042) (a00ae5c)

[1.68.0](https://github.com/taskforcesh/bullmq/compare/v1.67.3...v1.68.0) (2022-01-29)

Features

  • queue: add retryJobs method for failed jobs (#1024) (310a730)

Performance Improvements

  • lua: call del command with multiple keys (#1035) (9cfaab8)

[1.67.3](https://github.com/taskforcesh/bullmq/compare/v1.67.2...v1.67.3) (2022-01-28)

Bug Fixes

  • drain: consider checking parent jobs when draining (#992) (81b7221)

[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

  • retry: delete props in retryJob lua script (#1016) (547cedd)

[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

  • queue-events: add retries-exhausted event (#1010) (e476f35)

[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

  • queue: add JobType and JobState unions for better typing (#1011) (3b9b79d)

[1.64.4](https://github.com/taskforcesh/bullmq/compare/v1.64.3...v1.64.4) (2022-01-19)

Bug Fixes

  • queue: use 0 as initial value for getJobCountByTypes reducer (#1005) (f0e23ef)

[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

  • remove-job: consider removing parent dependency key in lua scripts (#990) (661abf0)

[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

  • sanboxed-process: support .cjs files (#984) (531e4de)

[1.63.3](https://github.com/taskforcesh/bullmq/compare/v1.63.2...v1.63.3) (2022-01-06)

Bug Fixes

  • job: throw error when delay and repeat are provided together (#983) (07b0082)

[1.63.2](https://github.com/taskforcesh/bullmq/compare/v1.63.1...v1.63.2) (2022-01-04)

Bug Fixes

  • queue: add missing error event typing (#979) (afdaac6)

[1.63.1](https://github.com/taskforcesh/bullmq/compare/v1.63.0...v1.63.1) (2022-01-04)

Bug Fixes

  • update-progress: throw error if job key is missing (#978) ref #977 (b03aaf1)

[1.63.0](https://github.com/taskforcesh/bullmq/compare/v1.62.0...v1.63.0) (2021-12-31)

Features

  • job: use generic types for static methods (#975) (f78f4d0)

[1.62.0](https://github.com/taskforcesh/bullmq/compare/v1.61.0...v1.62.0) (2021-12-31)

Bug Fixes

  • add deprecated tag in progress and Queue3 class (#973) (6abdf5b)

Features

[1.61.0](https://github.com/taskforcesh/bullmq/compare/v1.60.0...v1.61.0) (2021-12-29)

Features

  • queue: reuse generic typing for jobs (5c10818)
  • worker: reuse generic typing for jobs (9adcdb7)

[1.60.0](https://github.com/taskforcesh/bullmq/compare/v1.59.4...v1.60.0) (2021-12-29)

Features

  • queue-scheduler: add better event typing (#963) (b23c006)

[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

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

  • connection: check instance options to console log deprecation message (#927) (fc1e2b9)

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

  • queue-events: add better event typing (#919) (e980080)

[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

  • worker: always try to move to active after waiting for job (#914) (97b7084)

[1.55.0](https://github.com/taskforcesh/bullmq/compare/v1.54.6...v1.55.0) (2021-12-02)

Features

  • script-loader: lua script loader with include support (#897) (64b6ccf)

[1.54.6](https://github.com/taskforcesh/bullmq/compare/v1.54.5...v1.54.6) (2021-11-30)

Bug Fixes

  • stalled: save finishedOn when job stalled more than allowable limit (#900) (eb89edf)

[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

  • child-processor: add deprecation warning for progress method (#890) (f80b19a)

[1.54.3](https://github.com/taskforcesh/bullmq/compare/v1.54.2...v1.54.3) (2021-11-22)

Bug Fixes

  • clean: use range values in lua script (#885) (02ef63a)

[1.54.2](https://github.com/taskforcesh/bullmq/compare/v1.54.1...v1.54.2) (2021-11-20)

Bug Fixes

  • job: use this when use new operators (#884) (7b84283)

[1.54.1](https://github.com/taskforcesh/bullmq/compare/v1.54.0...v1.54.1) (2021-11-19)

Bug Fixes

  • job: change private attributes to protected for extensions (#882) (ffcc3f0)

[1.54.0](https://github.com/taskforcesh/bullmq/compare/v1.53.0...v1.54.0) (2021-11-17)

Features

  • load-includes: export includes to be reused in extensions (#877) (b56c4a9)

[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

  • worker: change private attributes to protected for pro extension (#874) (1c73881)

[1.52.1](https://github.com/taskforcesh/bullmq/compare/v1.52.0...v1.52.1) (2021-11-12)

Performance Improvements

  • clean: speed up clean method when called with limit param (#864) (09b5cb4)

[1.52.0](https://github.com/taskforcesh/bullmq/compare/v1.51.3...v1.52.0) (2021-11-11)

Features

  • queue: add waiting event type declaration (#872) (f29925d)

[1.51.3](https://github.com/taskforcesh/bullmq/compare/v1.51.2...v1.51.3) (2021-11-04)

Bug Fixes

  • move-to-failed: delete closing check that prevents script execution (#858) fixes #834 (d50814f)

[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

  • queue-base: show connection deprecation warning (#832) fixes #829 (5d023fe)

[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

  • msgpackr: upgrade version to 1.4.6 to support esm bundlers (#818) fixes #813 (913d7a9)

[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

  • sandboxed-process: handle init-failed error (#797) (5d2f553)

[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

  • obliterate: do not pass unused variables (#766) (e9abfa6)

[1.48.1](https://github.com/taskforcesh/bullmq/compare/v1.48.0...v1.48.1) (2021-09-23)

Bug Fixes

  • obliterate: consider dependencies and processed keys (#765) (fd6bad8)

[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

  • flow-producer: use default prefix in add method (#763) fixes #762 (fffdb55)

[1.47.1](https://github.com/taskforcesh/bullmq/compare/v1.47.0...v1.47.1) (2021-09-17)

Bug Fixes

  • running: move running attribute before first async call (#756) (f7f0660)

[1.47.0](https://github.com/taskforcesh/bullmq/compare/v1.46.7...v1.47.0) (2021-09-16)

Features

  • queue-events: launch without launching process (#750) (23a2360)

[1.46.7](https://github.com/taskforcesh/bullmq/compare/v1.46.6...v1.46.7) (2021-09-16)

Bug Fixes

  • wait-for-job: add catch block and emit error (#749) (b407f9a)

[1.46.6](https://github.com/taskforcesh/bullmq/compare/v1.46.5...v1.46.6) (2021-09-15)

Bug Fixes

  • connection: fail only if redis connection does not recover (#751) (8d59ced)

[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

  • wait-until-finished: isFinished return failedReason or returnValue (#743) fixes #555 (63acae9)

[1.46.3](https://github.com/taskforcesh/bullmq/compare/v1.46.2...v1.46.3) (2021-09-08)

Bug Fixes

  • add-job: throw error when missing parent key (#739) (d751070)

[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

  • redis-connection: improve closing fixes #721 (9d8eb03)

[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

  • queue-scheduler: launch without launching process (#729) (f1932a7), closes #436

[1.44.3](https://github.com/taskforcesh/bullmq/compare/v1.44.2...v1.44.3) (2021-09-02)

Bug Fixes

  • queuescheduler: handle shared connections fixes #721 (32a2b2e)

[1.44.2](https://github.com/taskforcesh/bullmq/compare/v1.44.1...v1.44.2) (2021-08-29)

Bug Fixes

  • worker: use spread operator in processing map keys (#720) (32f1e57)

[1.44.1](https://github.com/taskforcesh/bullmq/compare/v1.44.0...v1.44.1) (2021-08-29)

Bug Fixes

  • retry: throw error when retry non failed job (#717) (bb9b192)

[1.44.0](https://github.com/taskforcesh/bullmq/compare/v1.43.0...v1.44.0) (2021-08-27)

Features

  • queue-events: add waiting-children event (#704) (18b0b79)

[1.43.0](https://github.com/taskforcesh/bullmq/compare/v1.42.1...v1.43.0) (2021-08-25)

Features

  • events: add added event when job is created (#699) (f533cc5)

[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

[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

  • connection hangs with failed connection fixes #656 (c465611)

[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

  • stalled-jobs: move stalled jobs to wait in batches (a23fcb8), closes #422

[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

  • worker: add active event typing (5508cdf)
  • worker: add progress event typing (119cb7c)

[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

[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

[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

  • add move to waiting children for manual processing (#477) (f312f29)

[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

  • get-workers: use strict equality on name fixes #564 (4becfa6)

[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

  • ensure connection reconnects when pausing fixes #160 (f38fee8)

[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

  • flow-producer: use custom jobId as parentId for children fixes #552 (645b576)

[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

  • flow-producer: process parent with children as empty array fixes #547 (48168f0)

[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

  • cluster: add redis cluster support (5a7dd14)
  • redisclient: not reference types from import (022fc04)

[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

  • worker: make token optional in processor function fixes #490 (3940bd7)

[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

  • add support for flows (parent-child dependencies) (#454) (362212c)

[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

  • add method to "obliterate" a queue, fixes #430 (624be0e)

[1.14.8](https://github.com/taskforcesh/bullmq/compare/v1.14.7...v1.14.8) (2021-03-06)

Bug Fixes

  • specify promise type to make TS 4.1 and 4.2 happy. (#418) (702f609)

[1.14.7](https://github.com/taskforcesh/bullmq/compare/v1.14.6...v1.14.7) (2021-02-16)

Bug Fixes

  • remove "client" property of QueueBaseOptions (#324) (e0b9e71)

[1.14.6](https://github.com/taskforcesh/bullmq/compare/v1.14.5...v1.14.6) (2021-02-16)

Bug Fixes

  • remove next job in removeRepeatableByKey fixes #165 (fb3a7c2)

[1.14.5](https://github.com/taskforcesh/bullmq/compare/v1.14.4...v1.14.5) (2021-02-16)

Bug Fixes

  • add jobId support to repeatable jobs fixes #396 (c2dc669)

[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

  • worker: avoid possible infinite loop fixes #389 (d05566e)

[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

  • add support for manually processing jobs fixes #327 (e42bfd2)

[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

  • correctly handle "falsy" data values fixes #264 (cf1dbaf)

[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

  • sandbox: kill child workers gracefully (#243) (4262837)

[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

[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

  • scheduler: divide timestamp by 4096 in update set fixes #168 (0c5db83)

[1.8.9](https://github.com/taskforcesh/bullmq/compare/v1.8.8...v1.8.9) (2020-05-25)

Bug Fixes

  • scheduler: divide next timestamp by 4096 (#204) (9562d74)

[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

  • worker: do not use global child pool fixes #172 (bc65f26)

[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

  • restore the Job timestamp when deserializing JSON data (#138) (#152) (c171bd4)

[1.8.1](https://github.com/taskforcesh/bullmq/compare/v1.8.0...v1.8.1) (2020-03-02)

Bug Fixes

  • modified imports to work when esModuleInterop is disabled (#132) (01681f2)

[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

  • types: add sandboxed job processor types (#114) (a50a88c)

[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

  • remove delay dependency (97e1a30)
  • remove dependence on Bluebird.delay #67 (bedbaf2)

[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

  • save job stacktrace on failure (85dfe52)
  • simplify logic for stackTraceLimit (296bd89)

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

  • redis-connection: allow providing scripts for extension (#1472) (f193cfb)

[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

  • flow-producer: allow parent opts in root job when adding a flow (#1110) ref #1097 (3c3ac71)

[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

  • sandbox: get open port using built-in module instead of get-port (#1446) (6db6288)

[2.1.0](https://github.com/taskforcesh/bullmq/compare/v2.0.2...v2.1.0) (2022-09-23)

Features

  • job-options: add failParentOnFailure option (#1339) (65e5c36)

[2.0.2](https://github.com/taskforcesh/bullmq/compare/v2.0.1...v2.0.2) (2022-09-22)

Bug Fixes

  • job: update delay value when moving to wait (#1436) (9560915)

[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

  • worker: use timeout as integer for redis lower than v6.0.0 (python) (#1981) (0df6afa)

[3.15.5](https://github.com/taskforcesh/bullmq/compare/v3.15.4...v3.15.5) (2023-06-11)

Bug Fixes

  • retry-job: consider priority when moving job to wait (python) (#1969) (e753855)

[3.15.4](https://github.com/taskforcesh/bullmq/compare/v3.15.3...v3.15.4) (2023-06-08)

Bug Fixes

  • job: import right reference of QueueEvents (#1964) (689c845)

[3.15.3](https://github.com/taskforcesh/bullmq/compare/v3.15.2...v3.15.3) (2023-06-08)

Bug Fixes

  • job: use QueueEvents type for waitUntilFinished (#1958) (881848c)

[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

  • rate-limit: call pttl in script moveJobFromActiveToWait (#1889) (e0d2992)

[3.13.3](https://github.com/taskforcesh/bullmq/compare/v3.13.2...v3.13.3) (2023-05-10)

Bug Fixes

  • child: use named import for EventEmitter (#1887) (1db396d)

[3.13.2](https://github.com/taskforcesh/bullmq/compare/v3.13.1...v3.13.2) (2023-05-09)

Bug Fixes

  • rate-limit: consider paused queue when dynamic rate limit (#1884) (a23f37e)

[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

  • flow: consider removing dependency on removeOnFail true (#1753) (de5a299)

[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

  • worker: throw error with invalid concurrency fixes #1723 (2a1cdbe)

[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

  • worker: add remove on complete and fail options (#1703) (cf13494)

[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

  • worker: restore failed event job parameter typing (#1707) (44c2203)

[3.7.1](https://github.com/taskforcesh/bullmq/compare/v3.7.0...v3.7.1) (2023-02-22)

Bug Fixes

  • worker: failed event receives an optional job parameter (#1702) fixes #1690 (6009906)

[3.7.0](https://github.com/taskforcesh/bullmq/compare/v3.6.6...v3.7.0) (2023-02-16)

Performance Improvements

  • move-to-active: remove deprecated limiter reference (#1673) (a97b22f)

[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

  • move-to-finished: return correct delayUntil (#1643) (c4bf9fa)

[3.5.9](https://github.com/taskforcesh/bullmq/compare/v3.5.8...v3.5.9) (2023-01-19)

Bug Fixes

  • worker: fix delayed jobs with concurrency fixes #1627 (99a8e6d)

[3.5.8](https://github.com/taskforcesh/bullmq/compare/v3.5.7...v3.5.8) (2023-01-18)

Bug Fixes

  • move-to-active: delete marker when it is moved to active (#1634) (ad1fcea)

[3.5.7](https://github.com/taskforcesh/bullmq/compare/v3.5.6...v3.5.7) (2023-01-17)

Bug Fixes

  • move-to-active: validate next marker and return delayUntil (#1630) (3cd3305)

[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

  • get-dependencies: replace slow object destructuring with single object (#1612) (621748e)

[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

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

[3.4.0](https://github.com/taskforcesh/bullmq/compare/v3.3.5...v3.4.0) (2022-12-09)

Features

  • worker: add ready event for blockingConnection (#1577) (992cc9e)

[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

  • add-job: throw error when jobId represents an integer (#1556) (db617d7)

[3.2.4](https://github.com/taskforcesh/bullmq/compare/v3.2.3...v3.2.4) (2022-11-29)

Bug Fixes

  • add-job: do not update job that already exist (#1550) (26f6311)

[3.2.3](https://github.com/taskforcesh/bullmq/compare/v3.2.2...v3.2.3) (2022-11-29)

Bug Fixes

  • rate-limit: delete rateLimiterKey when 0 (#1553) (0b88e5b)

[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

  • worker: consider removed jobs in failed event (#1500) (8704b9a)

[3.2.0](https://github.com/taskforcesh/bullmq/compare/v3.1.3...v3.2.0) (2022-11-09)

Features

  • flow: move parent to delayed when delay option is provided (#1501) (2f3e5d5)

[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

[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

  • delayed: add marker once when promoting delayed jobs (#3312) (c4a4ada)

[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

  • flows: update constructor and methods to match queue base (#2324) (d6c2064)

[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

  • repeat-strategy: add missing Promise return type (#2301) (6f8f534)

[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

  • worker: better handling of concurrency when fetching jobs (#2242) (d2e2035)

[4.13.3](https://github.com/taskforcesh/bullmq/compare/v4.13.2...v4.13.3) (2023-11-16)

Bug Fixes

  • utils: use EventEmitter as a type instead of a namespace (#2283) (41c9d1d)

[4.13.2](https://github.com/taskforcesh/bullmq/compare/v4.13.1...v4.13.2) (2023-11-09)

Bug Fixes

  • job: set delay value on current job instance when it is retried (#2266) (python) (76e075f)

[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

  • queue: improve clean to work iteratively (#2260) (0cfa66f)

[4.12.10](https://github.com/taskforcesh/bullmq/compare/v4.12.9...v4.12.10) (2023-11-05)

Bug Fixes

  • update delay job property when moving to delayed set (#2261) (69ece08)

[4.12.9](https://github.com/taskforcesh/bullmq/compare/v4.12.8...v4.12.9) (2023-11-05)

Bug Fixes

  • add-job: trim events when waiting-children event is published (#2262) (python) (198bf05)

[4.12.8](https://github.com/taskforcesh/bullmq/compare/v4.12.7...v4.12.8) (2023-11-03)

Bug Fixes

  • worker: keep extending locks while closing workers (#2259) (c4d12ea)

[4.12.7](https://github.com/taskforcesh/bullmq/compare/v4.12.6...v4.12.7) (2023-10-29)

Performance Improvements

  • redis-connection: check redis version greater or equal than v6 only once (#2252) (a09b15a)

[4.12.6](https://github.com/taskforcesh/bullmq/compare/v4.12.5...v4.12.6) (2023-10-26)

Bug Fixes

  • sandbox: do not return empty object result when it is undefined (#2247) (308db7f)

[4.12.5](https://github.com/taskforcesh/bullmq/compare/v4.12.4...v4.12.5) (2023-10-18)

Performance Improvements

  • events: trim events when removing jobs (#2235) (python) (889815c)

[4.12.4](https://github.com/taskforcesh/bullmq/compare/v4.12.3...v4.12.4) (2023-10-13)

Bug Fixes

  • events: do not publish removed event on non-existent jobs (#2227) (c134606)

[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

  • delayed: trim events when moving jobs to delayed (python) (#2211) (eca8c2d)

[4.12.0](https://github.com/taskforcesh/bullmq/compare/v4.11.4...v4.12.0) (2023-09-29)

Features

  • expose addJobLog and updateJobProgress to the Queue instance (#2202) (2056939)

[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

  • worker: throw exception with NaN as concurrency (#2184) (f36ac8b)

[4.11.1](https://github.com/taskforcesh/bullmq/compare/v4.11.0...v4.11.1) (2023-09-20)

Bug Fixes

  • queue: differentiate score purpose per state in clean method (#2133) fixes #2124 (862f10b)

[4.11.0](https://github.com/taskforcesh/bullmq/compare/v4.10.0...v4.11.0) (2023-09-16)

Features

  • sandbox: convert wrapJob method as protected for extension (#2182) (1494b55)

[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

  • connection: provide skipVersionCheck option for shared connections (#2149) ref #2148 (914820f)

[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

  • sandbox: ignore extra params on processor (#2142) (3602c20)

[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

  • queue: throw error when name is not provided (#2123) (78fb0e2)

[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

  • job: generate priority limit constant once (#2102) (8880f9f)

[4.6.2](https://github.com/taskforcesh/bullmq/compare/v4.6.0...v4.6.2) (2023-07-26)

Performance Improvements

  • retry: compare prev state instead of regex expression (#2099) (c141283)

[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

  • job: add option for removing children in remove method (python) (#2064) (841dc87)

[4.4.0](https://github.com/taskforcesh/bullmq/compare/v4.3.0...v4.4.0) (2023-07-17)

Features

  • job: add removeDependencyOnFailure option (#1953) (ffd49e2)

[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

  • flow: emit delayed event when parent is moved to delayed (#2055) (f419ff1)

[4.2.0](https://github.com/taskforcesh/bullmq/compare/v4.1.0...v4.2.0) (2023-07-03)

Features

  • common: add option to change repeatable jobs redis key hash algorithm (#2023) (ca17364)

[4.1.0](https://github.com/taskforcesh/bullmq/compare/v4.0.0...v4.1.0) (2023-06-23)

Features

  • queue: add getPrioritized and getPrioritizedCount methods (#2005) (7363abe)

[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

  • priority: add prioritized as a new state (#1984) (python) (42a890a)

BREAKING CHANGES

  • priority: priority is separeted in its own zset, no duplication needed

  • job: change job method name update to updateData

ref faster priority jobs


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

  • flow-producer: add createScripts method for extension (#4641) (9884e09)

[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

  • connection: add Valkey Glide client adapter (#4321) (e2b89f7)

[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

  • worker: emit active event for all jobs moved to active fixes #3911 (#4326) (b002d48)

[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

  • flow-producer: reuse queue's shared Scripts instance in jobs fixes #4263 (#4308) (4f4b574)

[5.80.8](https://github.com/taskforcesh/bullmq/compare/v5.80.7...v5.80.8) (2026-07-18)

Bug Fixes

  • scheduler: walk past stale slots when re-upserting under same id (#4299) (e8af563)

[5.80.7](https://github.com/taskforcesh/bullmq/compare/v5.80.6...v5.80.7) (2026-07-17)

Bug Fixes

  • worker: move stalled job to failed when fetched manually (#4294) (c4a0a4a)

[5.80.6](https://github.com/taskforcesh/bullmq/compare/v5.80.5...v5.80.6) (2026-07-17)

Bug Fixes

  • sandbox: preserve child_process exports in null-stdio (#4301) (5044cf8)

[5.80.5](https://github.com/taskforcesh/bullmq/compare/v5.80.4...v5.80.5) (2026-07-16)

Bug Fixes

  • sandbox: kill children that fail init and surface refusal errors fixes #4283 (#4284) (7dd064e)

[5.80.4](https://github.com/taskforcesh/bullmq/compare/v5.80.3...v5.80.4) (2026-07-15)

Bug Fixes

  • deps: update dependency ioredis to v5.11.1 [security] (#4282) (d978d72)

[5.80.3](https://github.com/taskforcesh/bullmq/compare/v5.80.2...v5.80.3) (2026-07-15)

Bug Fixes

  • fix potential job id integer to string conversion (#4262) (4e8b595)

[5.80.2](https://github.com/taskforcesh/bullmq/compare/v5.80.1...v5.80.2) (2026-07-11)

Bug Fixes

  • job-scheduler: respect offset option in upsertJobScheduler (elixir) (rust) (#3993) (78bbb25)

[5.80.1](https://github.com/taskforcesh/bullmq/compare/v5.80.0...v5.80.1) (2026-07-10)

Bug Fixes

  • job: enforce priority max of 2^21-1 to preserve FIFO at the boundary (#4261) (418de1e)

[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

  • job-scheduler: coerce string offset in Lua helper (#4266) (python) (elixir) (5a88614)

[5.79.3](https://github.com/taskforcesh/bullmq/compare/v5.79.2...v5.79.3) (2026-07-07)

Bug Fixes

  • queue-events: correct delay event number type and documentation (#3989) (6ffd88a)

[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

  • node-redis: accept plain createClient result without cast (#4201) (#4209) (1aefd5b)

[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

  • scheduler: fail stalled jobs if scheduler does not longer exist (elixir) (rust) (#4222) (d1fcda5)

[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

  • deps: update dependency msgpackr to v2.0.2 [security] (#4202) (fbe04af)

[5.77.6](https://github.com/taskforcesh/bullmq/compare/v5.77.5...v5.77.6) (2026-05-27)

Bug Fixes

  • types: change NodeRedisRawClient to be node-redis compliant (#4195) (81709e4)

[5.77.5](https://github.com/taskforcesh/bullmq/compare/v5.77.4...v5.77.5) (2026-05-27)

Bug Fixes

  • connection: handle cluster reconnection with timeouts (#4186) (411690e)

[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

  • bun-redis: remove per-command serialization to enable implicit pipelining (#4188) (685b074)

[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

  • connections: make sure we do not mutate ioredis (#4182) (75a66af)

[5.77.0](https://github.com/taskforcesh/bullmq/compare/v5.76.11...v5.77.0) (2026-05-21)

Features

  • refactored client code, adding support for node-redis and bun native redis client (#4170) (963c1b5)

[5.76.11](https://github.com/taskforcesh/bullmq/compare/v5.76.10...v5.76.11) (2026-05-21)

Bug Fixes

  • worker: stop fetching next jobs when closing on manual job movement (#4178) fixes #4163 (7b9f7e0)

[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

  • scheduler: align first 'every' job to the next offset slot (#4113) fixes #3705 (1b8f900)

[5.76.7](https://github.com/taskforcesh/bullmq/compare/v5.76.6...v5.76.7) (2026-05-11)

Bug Fixes

  • deps: update dependency semver to v7.8.0 [security] (#4160) (093743a)

[5.76.6](https://github.com/taskforcesh/bullmq/compare/v5.76.5...v5.76.6) (2026-05-06)

Bug Fixes

  • connection: reconnect wedged blocking cluster clients (#4151) (e94e8cd)

[5.76.5](https://github.com/taskforcesh/bullmq/compare/v5.76.4...v5.76.5) (2026-05-02)

Bug Fixes

  • deps: update dependency msgpackr to v1.11.12 (#3939) (b47f00b)

[5.76.4](https://github.com/taskforcesh/bullmq/compare/v5.76.3...v5.76.4) (2026-04-29)

Bug Fixes

  • flow-producer: surface ParentJobNotExist errors from add() (#3264) (#4058) (7ed0eec)

[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

  • worker: use scheduler registry to discriminate repeatable keys (#4007) (ea7705d)

[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

  • sandbox: remove returnvalue from JobJsonSandbox interface (#3950) (e9d0c2d)

[5.74.0](https://github.com/taskforcesh/bullmq/compare/v5.73.5...v5.74.0) (2026-04-15)

Features

  • sandbox: add getDependencies proxy for sandboxed processors (#3922) ref #3533 (ec420d1)

[5.73.5](https://github.com/taskforcesh/bullmq/compare/v5.73.4...v5.73.5) (2026-04-12)

Bug Fixes

  • worker: resume processing after pause with doNotWaitActive (#3974) fixes #3971 (8b8d464)

[5.73.4](https://github.com/taskforcesh/bullmq/compare/v5.73.3...v5.73.4) (2026-04-10)

Bug Fixes

  • worker: emit active event as soon as getting next job (elixir) (python) (#3936) ref #3911 (d5eca5a)

[5.73.3](https://github.com/taskforcesh/bullmq/compare/v5.73.2...v5.73.3) (2026-04-09)

Performance Improvements

  • delayed: allow to fetch next job when moving job to delayed (python) (elixir) (#3870) (0cb0b8c)

[5.73.2](https://github.com/taskforcesh/bullmq/compare/v5.73.1...v5.73.2) (2026-04-09)

Bug Fixes

  • flow: correctly propagate root jobId from pipeline results (#3905) (242f264)

[5.73.1](https://github.com/taskforcesh/bullmq/compare/v5.73.0...v5.73.1) (2026-04-08)

Bug Fixes

  • sandbox: add missing type declarations to SandboxedJob interface (#3946) fixes #3925 (4c6b2b2)

[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

  • cancellation: use native AbortController implementation if found (#3903) (46880af)

[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

  • deps: update dependency ioredis to v5.10.1 (#3897) (60f645a)

[5.71.0](https://github.com/taskforcesh/bullmq/compare/v5.70.4...v5.71.0) (2026-03-11)

Features

  • otel: support gauge metric when counting jobs by state (#3811) (1283ac7)

[5.70.4](https://github.com/taskforcesh/bullmq/compare/v5.70.3...v5.70.4) (2026-03-06)

Bug Fixes

  • flow: allow deduplication from root parent (python) (elixir) (#3817) fixes #3761 (6cd60a7)

[5.70.3](https://github.com/taskforcesh/bullmq/compare/v5.70.2...v5.70.3) (2026-03-06)

Bug Fixes

  • otel: use job timestamps for process span attributes (#3832) (450253c)

[5.70.2](https://github.com/taskforcesh/bullmq/compare/v5.70.1...v5.70.2) (2026-03-05)

Bug Fixes

  • auto-remove: remove orphaned jobs when auto-remove is enabled (#3853) (504b536)

[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

  • worker: add cancelation support to sandboxed processors (#3806) (0d3879b)

[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

  • queue: forward error from repeat or job-scheduler instances (#3775) fixes #3774 (a62241f)

[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

  • connection: add datatype for version differentiation (#3746) (af9197d)

[5.67.3](https://github.com/taskforcesh/bullmq/compare/v5.67.2...v5.67.3) (2026-02-05)

Bug Fixes

  • connection: merge redisOptions when duplicating cluster (#3759) (afb878f)

[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

  • deps: update dependency ioredis to v5.9.2 (#3713) (87e74b5)

[5.66.6](https://github.com/taskforcesh/bullmq/compare/v5.66.5...v5.66.6) (2026-01-22)

Performance Improvements

  • job: apply limit when removing jobs by max age (python) (elixir) (#3694) fixes #3672 (a8fc316)

[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

  • flow: remove debounce option from flow producer (#3646) (cc74805)

[5.66.3](https://github.com/taskforcesh/bullmq/compare/v5.66.2...v5.66.3) (2025-12-26)

Bug Fixes

  • flow: remove deduplication option from flow producer (#3637) (f60c172)

[5.66.2](https://github.com/taskforcesh/bullmq/compare/v5.66.1...v5.66.2) (2025-12-19)

Bug Fixes

  • telemetry: send most updated attemptsMade value when finishing (#3623) (1380a16)

[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

  • stalled: prevent lock errors while job is not longer in active state (#3579) (a8b9d76)

[5.65.0](https://github.com/taskforcesh/bullmq/compare/v5.64.1...v5.65.0) (2025-11-26)

Features

  • job: support removeDeduplicationKey method (#3575) (b059cfc)

[5.64.1](https://github.com/taskforcesh/bullmq/compare/v5.64.0...v5.64.1) (2025-11-21)

Performance Improvements

  • worker: promote delayed jobs while queue is rate limited (#3561) (a474801)

[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

  • connection: consider error code when checking connection error (#3537) (045f3e7)

[5.63.1](https://github.com/taskforcesh/bullmq/compare/v5.63.0...v5.63.1) (2025-11-13)

Bug Fixes

  • job-scheduler: changing every in upsert resets the iterations (#3551) (b4c7c65)

[5.63.0](https://github.com/taskforcesh/bullmq/compare/v5.62.2...v5.63.0) (2025-10-31)

Bug Fixes

  • queue: emit progress event when calling updateJobProgress (#3528) (c82df83)

Features

[5.62.2](https://github.com/taskforcesh/bullmq/compare/v5.62.1...v5.62.2) (2025-10-30)

Bug Fixes

  • upsertJobScheduler does not apply change on existing scheduled job (#3524) (98f73b3), closes #3500

[5.62.1](https://github.com/taskforcesh/bullmq/compare/v5.62.0...v5.62.1) (2025-10-30)

Performance Improvements

  • worker: call moveToActive after special errors (#3497) (37e9db5)

[5.62.0](https://github.com/taskforcesh/bullmq/compare/v5.61.2...v5.62.0) (2025-10-28)

Features

  • queue: support getGlobalRateLimit method (#3511) (6a31e0a)

[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

  • worker: do not retry processor when connection errors happen (#3482) (f1573b3)

[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

Performance Improvements

  • worker: only consider infinity retry on connection errors (#3473) (9d5a678)

[5.58.9](https://github.com/taskforcesh/bullmq/compare/v5.58.8...v5.58.9) (2025-09-26)

Performance Improvements

  • metrics: use lua script when calling getMetrics (#3459) (61987c6)

[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

  • job: add custom jobId validation to prevent : inclusion (#3384) fixes #3382 (845a6f5)

[5.58.6](https://github.com/taskforcesh/bullmq/compare/v5.58.5...v5.58.6) (2025-09-19)

Bug Fixes

[5.58.5](https://github.com/taskforcesh/bullmq/compare/v5.58.4...v5.58.5) (2025-09-04)

Bug Fixes

  • queue: preserve Job type inference when no explicit type for JobBase (#3423) fixes #3421 (f642818)

[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

  • job-scheduler: consider undefined type in getJobScheduler return type (#3412) (ffc6e26)

[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

  • job: prevent unnecessary tryCatch calls in getTraces (#3400) (d71b872)

[5.58.0](https://github.com/taskforcesh/bullmq/compare/v5.57.0...v5.58.0) (2025-08-15)

Features

  • worker: adds jobName and attemptsMade span attributes when processJob is called (#3199) (db0a922)

[5.57.0](https://github.com/taskforcesh/bullmq/compare/v5.56.10...v5.57.0) (2025-08-13)

Features

  • sandbox: support moveToWaitingChildren method (#3389) (0fecc6c)

[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

  • worker: emit failed event when children are failed in moveToWaitingChildren (#3346) (93df852)

[5.56.8](https://github.com/taskforcesh/bullmq/compare/v5.56.7...v5.56.8) (2025-07-27)

Bug Fixes

  • queue: add support for 'waiting' parameter in clean method (#3338) fixes #3125 (edb7147)

[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

  • rate-limit: throw right error message if job does not exist (#3354) (83d9695)

[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

  • scheduler: take offset into the startMillis calculation (#2944) fixes #247 (1e3f3c5)

[5.56.2](https://github.com/taskforcesh/bullmq/compare/v5.56.1...v5.56.2) (2025-07-08)

Performance Improvements

  • woker: keep lower blockTimeout when consuming delayed markers (#3333) (e687d7c)

[5.56.1](https://github.com/taskforcesh/bullmq/compare/v5.56.0...v5.56.1) (2025-07-03)

Performance Improvements

  • worker: do not wait rate limit when fetching jobs (#3322) (c32e6a0)

[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

  • worker: allow calling moveToWait when job is processing (#3302) ref #3296 (e742511)

[5.54.3](https://github.com/taskforcesh/bullmq/compare/v5.54.2...v5.54.3) (2025-06-18)

Bug Fixes

  • scheduler: fix slot calculation when using every (#3307) (588719e)

[5.54.2](https://github.com/taskforcesh/bullmq/compare/v5.54.1...v5.54.2) (2025-06-17)

Bug Fixes

  • avoid circular reference between scripts and queue (#3301) (fb65677)

[5.54.1](https://github.com/taskforcesh/bullmq/compare/v5.54.0...v5.54.1) (2025-06-17)

Performance Improvements

  • scheduler: save offset value when every is provided (#3142) (98f35bc)

[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

  • worker: avoid dangling jobs to hang the queue with rate limit (#3297) fixes #3289 (263d33d)

[5.53.2](https://github.com/taskforcesh/bullmq/compare/v5.53.1...v5.53.2) (2025-06-02)

Performance Improvements

  • stalled: fail stalled jobs in a lazy way (#3266) (5cbf064)

[5.53.1](https://github.com/taskforcesh/bullmq/compare/v5.53.0...v5.53.1) (2025-05-30)

Bug Fixes

[5.53.0](https://github.com/taskforcesh/bullmq/compare/v5.52.3...v5.53.0) (2025-05-21)

Features

  • sandbox: add getIgnoredChildrenFailures method in job's wrapper (#3263) (5d2723d)

[5.52.3](https://github.com/taskforcesh/bullmq/compare/v5.52.2...v5.52.3) (2025-05-19)

Bug Fixes

  • flow: add new error code when parent has failed children (#3268) (b8fba5e)

Features

  • job: add moveToCompleted method [python] (#3251) (6a8e3e2)

[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

  • remove: pass correct children meta references (#3245) (01c62ad)

[5.52.0](https://github.com/taskforcesh/bullmq/compare/v5.51.1...v5.52.0) (2025-05-01)

Bug Fixes

  • connection: add str type in connection option [python] (#3212) (72fac42)

Features

  • flow: support failed children in getFlow and getDependencies methods (#3243) (d3b1cff)

[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

  • flow: support ignored children in getFlow and getDependencies methods (#3238) ref #3213 (2927803)

[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

  • queue: add getIgnoredChildrenFailures method (#3194) (4affb11)

[5.49.2](https://github.com/taskforcesh/bullmq/compare/v5.49.1...v5.49.2) (2025-04-21)

Performance Improvements

  • flow: change parent failure in a lazy way (#3228) (6b37a37)

[5.49.1](https://github.com/taskforcesh/bullmq/compare/v5.49.0...v5.49.1) (2025-04-17)

Bug Fixes

  • flow-producer: use FlowProducer prefix by default when calling getFlow (#3224) (bd17aad)

[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

  • job-scheduler: fix endDate presence validation (#3195) (339f13e)

[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

  • flow-producer: fix queueName otel attribute when passing it to addNode (#3198) (758ea26)

[5.47.0](https://github.com/taskforcesh/bullmq/compare/v5.46.1...v5.47.0) (2025-04-04)

Features

  • flows: add continueParentOnFailure option (#3181) (738d375)

[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

  • updateProgress: allow more types to be used as progress (#3187) (f16b748)

[5.45.2](https://github.com/taskforcesh/bullmq/compare/v5.45.1...v5.45.2) (2025-03-29)

Bug Fixes

  • flow: validate pending dependencies before removing lock (#3182) (8d59e3b)

[5.45.1](https://github.com/taskforcesh/bullmq/compare/v5.45.0...v5.45.1) (2025-03-29)

Bug Fixes

  • job-scheduler: emit duplicated event when next delayed job exists (#3172) (d57698f)

[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

  • scheduler: remove next delayed job when possible (#3153) (219c0db)

[5.44.3](https://github.com/taskforcesh/bullmq/compare/v5.44.2...v5.44.3) (2025-03-22)

Bug Fixes

  • flow: only validate pending dependencies when moving to completed (#3164) (d3c397f)

[5.44.2](https://github.com/taskforcesh/bullmq/compare/v5.44.1...v5.44.2) (2025-03-22)

Performance Improvements

  • flow: validate parentKey existence before trying to move it to failed (#3163) (5a88e47)

[5.44.1](https://github.com/taskforcesh/bullmq/compare/v5.44.0...v5.44.1) (2025-03-21)

Bug Fixes

  • flow: consider prioritized state when moving a parent to failed (#3160) (d91d9f4)

[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

  • job-scheduler: add marker when upserting job scheduler if needed (#3145) (0e137b2)

[5.43.0](https://github.com/taskforcesh/bullmq/compare/v5.42.0...v5.43.0) (2025-03-13)

Features

  • job: support ignored and failed counts in getDependenciesCount (#3137) ref #3136 (83953db)

[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

  • job: add complete span in moveToCompleted method (#3132) (c37123c)

Performance Improvements

  • worker: optimize job retrieval for failed jobs in chunks (#3127) (e0f02ce)

[5.41.9](https://github.com/taskforcesh/bullmq/compare/v5.41.8...v5.41.9) (2025-03-11)

Bug Fixes

  • scheduler: remove multi when updating a job scheduler (#3108) (4b619ca)

[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

  • scheduler: validate repeatKey if present when cleaning failed jobs (#3115) fixes #3114 (d4cad84)

[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

  • job-scheduler: consider removing current job from wait, paused or prioritized (#3066) (97cd2b1)

[5.41.4](https://github.com/taskforcesh/bullmq/compare/v5.41.3...v5.41.4) (2025-02-21)

Performance Improvements

  • delayed: add marker once when promoting delayed jobs (#3096) (python) (38912fb)

[5.41.3](https://github.com/taskforcesh/bullmq/compare/v5.41.2...v5.41.3) (2025-02-19)

Bug Fixes

  • worker: do not execute run method when no processor is defined when resuming (#3089) (4a66933)

[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

  • job: set processedBy when moving job to active in moveToFinished (#3077) fixes #3073 (1aa970c)

[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

  • add-job: add job into wait or prioritized state when delay is provided as 0 (#3052) (3e990eb)

[5.40.5](https://github.com/taskforcesh/bullmq/compare/v5.40.4...v5.40.5) (2025-02-14)

Bug Fixes

  • drain: pass delayed key for redis cluster (#3074) (05ea32b)

[5.40.4](https://github.com/taskforcesh/bullmq/compare/v5.40.3...v5.40.4) (2025-02-13)

Bug Fixes

  • job-scheduler: restore limit option to be saved (#3071) (3e649f7)

[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

  • worker: wait fetched jobs to be processed when closing (#3059) (d4de2f5)

[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

  • worker: evaluate if a job needs to be fetched when moving to failed (#3043) (406e21c)

[5.39.1](https://github.com/taskforcesh/bullmq/compare/v5.39.0...v5.39.1) (2025-01-30)

Bug Fixes

  • retry-job: consider updating failures in job (#3036) (21e8495)

[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

  • job-scheduler: use delayed job data when template data is not present (#3010) fixes #3009 (95edb40)

[5.34.9](https://github.com/taskforcesh/bullmq/compare/v5.34.8...v5.34.9) (2025-01-12)

Bug Fixes

  • job-scheduler: add next delayed job only when prevMillis matches with producerId (#3001) (4ea35dd)

[5.34.8](https://github.com/taskforcesh/bullmq/compare/v5.34.7...v5.34.8) (2025-01-08)

Performance Improvements

  • job-scheduler: add delayed job and update scheduler in same script (#2997) (9be28a0)

[5.34.7](https://github.com/taskforcesh/bullmq/compare/v5.34.6...v5.34.7) (2025-01-06)

Performance Improvements

  • job-scheduler: add delayed job and scheduler in same script (#2993) (95718e8)

[5.34.6](https://github.com/taskforcesh/bullmq/compare/v5.34.5...v5.34.6) (2024-12-31)

Bug Fixes

  • job-scheduler: avoid duplicates when upserting in a quick sequence (#2991) (e8cdb99)

[5.34.5](https://github.com/taskforcesh/bullmq/compare/v5.34.4...v5.34.5) (2024-12-25)

Bug Fixes

  • dynamic-rate-limit: validate job lock cases (#2975) (8bb27ea)

[5.34.4](https://github.com/taskforcesh/bullmq/compare/v5.34.3...v5.34.4) (2024-12-21)

Bug Fixes

  • sandbox: fix issue where job could stay in active forever (#2979) (c0a6bcd)

[5.34.3](https://github.com/taskforcesh/bullmq/compare/v5.34.2...v5.34.3) (2024-12-18)

Bug Fixes

  • sandboxed: fix detecting special errors by sending default messages (#2967) fixes #2962 (52b0e34)

[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

  • telemetry: add option to omit context propagation on jobs (#2946) (6514c33)

[5.33.1](https://github.com/taskforcesh/bullmq/compare/v5.33.0...v5.33.1) (2024-12-10)

Bug Fixes

  • job-scheduler: omit deduplication and debounce options from template options (#2960) (b5fa6a3)

[5.33.0](https://github.com/taskforcesh/bullmq/compare/v5.32.0...v5.33.0) (2024-12-09)

Features

  • replace multi by lua scripts in moveToFailed (#2958) (c19c914)

[5.32.0](https://github.com/taskforcesh/bullmq/compare/v5.31.2...v5.32.0) (2024-12-08)

Features

  • queue: enhance getJobSchedulers method to include template information (#2956) ref #2875 (5b005cd)

[5.31.2](https://github.com/taskforcesh/bullmq/compare/v5.31.1...v5.31.2) (2024-12-06)

Bug Fixes

  • worker: catch connection error when moveToActive is called (#2952) (544fc7c)

[5.31.1](https://github.com/taskforcesh/bullmq/compare/v5.31.0...v5.31.1) (2024-12-04)

Bug Fixes

  • scheduler-template: remove console.log when getting template information (#2950) (3402bfe)

[5.31.0](https://github.com/taskforcesh/bullmq/compare/v5.30.1...v5.31.0) (2024-12-02)

Features

  • queue: enhance getJobScheduler method to include template information (#2929) ref #2875 (cb99080)

[5.30.1](https://github.com/taskforcesh/bullmq/compare/v5.30.0...v5.30.1) (2024-11-30)

Bug Fixes

  • flow: allow using removeOnFail and failParentOnFailure in parents (#2947) fixes #2229 (85f6f6f)

[5.30.0](https://github.com/taskforcesh/bullmq/compare/v5.29.1...v5.30.0) (2024-11-29)

Bug Fixes

  • job-scheduler: upsert template when same pattern options are provided (#2943) ref #2940 (b56c3b4)

Features

[5.29.1](https://github.com/taskforcesh/bullmq/compare/v5.29.0...v5.29.1) (2024-11-23)

Bug Fixes

  • scheduler: remove deprecation warning on immediately option (#2923) (14ca7f4)

[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

  • queue: change _jobScheduler from private to protected for extension (#2920) (34c2348)

[5.28.1](https://github.com/taskforcesh/bullmq/compare/v5.28.0...v5.28.1) (2024-11-20)

Bug Fixes

  • scheduler: use Job class from getter for extension (#2917) (5fbb075)

[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

Performance Improvements

  • marker: add base markers while consuming jobs to get workers busy (#2904) fixes #2842 (1759c8b)

[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

  • improve queue getters to use generic job type (#2905) (c9531ec)

[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

  • connection: do not allow to set blockingConnection option (#2851) (9391cc2)

[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

  • scripts: set package version by default for extension (#2887) (b955340)

[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

  • connection: set packageVersion as protected attribute for extension (#2884) (411ccae)

[5.25.0](https://github.com/taskforcesh/bullmq/compare/v5.24.0...v5.25.0) (2024-11-06)

Features

  • queue-events: add QueueEventsProducer for publishing custom events (#2844) (5eb03cd)

[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

  • deps: bump msgpackr to 1.1.2 to resolve ERR_BUFFER_OUT_OF_BOUNDS error (#2882) ref #2747 (4d2136c)

[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

  • repeatable: avoid delayed job deletion if next job already existed (#2778) (6a851c1)

[5.13.1](https://github.com/taskforcesh/bullmq/compare/v5.13.0...v5.13.1) (2024-09-18)

Bug Fixes

  • connection: allow passing connection string into IORedis (#2746) (73005e8)

[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

  • metrics: save zeros as much as max data points (#2758) (3473054)

[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

  • flow: remove debounce key when parent is moved to fail (#2720) (d51aabe)

[5.12.9](https://github.com/taskforcesh/bullmq/compare/v5.12.8...v5.12.9) (2024-08-17)

Performance Improvements

  • fifo-queue: use linked list structure for queue (#2629) (df74578)

[5.12.8](https://github.com/taskforcesh/bullmq/compare/v5.12.7...v5.12.8) (2024-08-17)

Bug Fixes

  • flow: recursive ignoreDependencyOnFailure option (#2712) (53bc9eb)

[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

  • connection: remove unnecessary process.env.CI reference (#2705) (53de304)

[5.12.4](https://github.com/taskforcesh/bullmq/compare/v5.12.3...v5.12.4) (2024-08-12)

Bug Fixes

  • worker: fix close sequence to reduce risk for open handlers (#2656) (8468e44)

[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

  • worker: promote delayed jobs while queue is rate limited (#2697) ref #2582 (f3290ac)

[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

  • queue-events: pass debounceId as a param of debounced event (#2678) (97fb97a)

[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

  • repeatable: remove repeat hash when removing repeatable job (#2676) (97a297d)

[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

  • delayed: keep moving delayed jobs to waiting when queue is paused (#2640) (python) (b89e2e0)

[5.8.6](https://github.com/taskforcesh/bullmq/compare/v5.8.5...v5.8.6) (2024-07-11)

Bug Fixes

  • delayed: avoid using jobId in order to schedule delayed jobs (#2587) (python) (228db2c)

[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

  • queue-getters: consider passing maxJobs when calling getRateLimitTtl (#2631) fixes #2628 (9f6609a)

[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

  • priority: consider paused state when calling getCountsPerPriority (python) (#2609) (6e99250)

[5.8.1](https://github.com/taskforcesh/bullmq/compare/v5.8.0...v5.8.1) (2024-06-12)

Bug Fixes

  • priority: use module instead of bit.band to keep order (python) (#2597) (9ece15b)

[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

  • job: set processedBy using hmset (#2592) (python) (238680b)

[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)

[5.7.13](https://github.com/taskforcesh/bullmq/compare/v5.7.12...v5.7.13) (2024-05-28)

Bug