Skip to content
Get started
Get started
WorkerOptions Reference
View Markdown
guide · worker

Every knob, with its default.

The complete option surface for a Worker, what each one changes, and the defaults you get when you leave it alone.

const worker = new Worker('queue', processor, {
embedded: true,
concurrency: 5,
batchSize: 100, // Pull up to 100 jobs per request
pollTimeout: 5000, // Long-poll: wait up to 5s for jobs instead of busy polling
limiter: { max: 10, duration: 1000 }, // Max 10 jobs per second
});

The table below documents the shared TypeScript Worker options for Bun, Node.js, and Deno. Options for the other SDKs are tabulated in the SDK guide.

OptionTypeDefaultDescription
embeddedbooleanfalseUse in-process mode
concurrencynumber1Parallel job processing
autorunbooleantrueStart polling automatically
heartbeatIntervalnumber10000Heartbeat interval in ms (0 = disabled)
batchSizenumber10Jobs to pull per batch (max: 1000)
batch{ size, minSize?, timeout?, groupAffinity? }-Native batch processor. job.getBatch() exposes members and member.setAsFailed(error) selectively fails one job. minSize waits indefinitely without timeout; grouped batches require groupAffinity to wait.
pollTimeoutnumber0Long-poll timeout in ms (max: 30000)
useLocksbooleantrueEnable BullMQ-style job locks
limiter{ max, duration, groupKey? }-Without groupKey: max job starts per rolling window, acquired atomically even with concurrent or manual processing. With groupKey: per-group concurrency cap of max (jobs grouped by job.data[groupKey], duration unused)
group{ concurrency?, limit?: { max, duration } }unlimited / noneBroker-authoritative per-job-group concurrency and fixed-window rate defaults. See Job Groups
lockDurationnumber30000Job lock TTL in ms
maxStalledCountnumber1Accepted for BullMQ compatibility, but not applied by the Worker. Configure the broker’s per-queue maxStalls policy with Queue.setStallConfig() or the HTTP API instead
skipStalledCheckbooleanfalseIn embedded or TCP mode, skip only this Worker’s subscription to stalled notifications. It does not disable broker-side stall detection or recovery
skipLockRenewalbooleanfalseSuppress the per-job heartbeat timer entirely (no JobHeartbeat sent), so both lock renewal and broker-side stall freshness stop; only the worker-registration heartbeat keeps running
drainDelaynumber50Delay between polls when the queue is empty (ms)
removeOnCompleteboolean | number | KeepJobsfalseAuto-remove completed jobs. Only true is honored; number / { age?, count? } are accepted for BullMQ type compatibility but ignored — the job’s own removeOnComplete option still applies
removeOnFailboolean | number | KeepJobsfalseSame behavior as removeOnComplete: only true is honored, other values are ignored and the job-level removeOnFail option still applies
connectionConnectionOptions-TCP connection (host, port, token, poolSize)
prefixKeystring-Namespace prefix; must match the producing Queue’s. See Namespace Isolation

Connection pool sizing (TCP): when poolSize is not set, it defaults to min(concurrency, 8). Override it by setting poolSize explicitly.

Embedded storage optionTypeDefaultDescription
dataPathstringUnsetSQLite path for the process-wide embedded manager. Use the same path as the producing Queue. A conflicting path throws; TCP storage is configured on the server.

If dataPath is omitted, the Worker uses the existing embedded manager or the configured data-path environment variables. With neither a path nor a configured manager, embedded storage is memory-only. See Persistence.

batch.size must be an integer from 1 through 1000. minSize defaults to 1, must be no larger than size, and waits indefinitely when timeout is omitted or zero. With a global Worker limiter, minSize must also be no larger than limiter.max; batch.size may be larger and is processed in bounded chunks. A positive timeout allows the available partial batch to start after that many milliseconds. groupAffinity: true makes each processor batch homogeneous by group ID; without affinity, batches containing grouped jobs do not wait for minSize.

With native batching, concurrency counts processor invocations rather than individual batch members. The leading job exposes every member through getBatch(), and setAsFailed(error) marks one member for its own failure and retry transition. A Worker limiter counts every member and reserves the whole batch atomically only when it is ready; waiting for minSize consumes no rate slots. Cancelling or timing out any member aborts the one shared processor signal. See Worker Concurrency and Batch Pulling.

GuideWhat it covers
WorkerCreate a worker and process your first job
Worker Concurrency and Batch PullingRun jobs in parallel and pull them in batches
The Job Object Inside a Worker ProcessorEverything the processor receives and can do
Worker Eventscompleted, failed, stalled and the rest
Worker Error Handling, Retries and BackoffRetries, backoff, timeouts and giving up
Worker LifecyclePause, resume and shut down without losing work
Heartbeats, Stall Detection and Lock OwnershipHeartbeats, stall recovery and lock ownership
SandboxedWorkerExperimental isolation for CPU-heavy handlers