Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Job Queue Bundle Laravel Package

jms/job-queue-bundle

A Symfony bundle that adds a persistent, Doctrine-backed job queue to your application. It supports job scheduling, dependencies, retries, parallel workers, and a web interface for monitoring and managing queued jobs.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit — the load-bearing finding: this is not a Laravel package. jms/job-queue-bundle is a Symfony Bundle. It registers itself through Symfony\Component\HttpKernel\Bundle\Bundle, boots via Symfony's DI container compiler passes, and exposes its functionality as jms-job-queue:* Symfony Console commands. Laravel has no bundle/DI-compiler-pass concept; there is no service provider, no facade, no config publishing, no Artisan integration. Dropping this into a Laravel application is not an integration task, it is a reimplementation task. For a Laravel-centric stack the correct TPM framing is not "how do we adopt this" but "what does this package's design tell us about requirements we may be under-serving natively."

What it actually does, and whether we need it. The bundle persists Symfony Console invocations as Doctrine ORM entities (Job), lets you enqueue and schedule them, and provides a long-running jms-job-queue:run worker that executes and tracks them with dependency ordering between jobs. That is a genuinely useful shape: durable, inspectable, schedulable command execution with a dependency graph (job B waits on job A). Laravel's nearest equivalents are Queue::push(new SomeJob) for background work, $schedule->command() for cron-style scheduling, and Bus::chain() / Bus::batch() for sequencing — all native, all supported, and Bus::batch() covers the dependency-ordering use case that is this bundle's differentiator.

Technical risk. High and largely disqualifying for new work:

  • Staleness. Last release 2019-09-09. That predates Symfony 5 GA, PHP 8.0, and Doctrine ORM 3. Expect Composer constraint conflicts against a modern Laravel/Symfony dependency graph; likely requires --ignore-platform-reqs or a forked constraint set, both of which are unpatchable technical debt.
  • Coupling. Hard dependency on Doctrine ORM plus jms/di-extra-bundle-era Symfony patterns. Doctrine is explicitly not the Laravel default; Laravel's Eloquent and Doctrine's Unit of Work do not compose cleanly in one process.
  • Zero dependents in the dataset. No downstream packages or consumers means no incidental bug-fixing, no community-supplied patches, and no evidence of production hardening at scale.
  • Security posture. An unmaintained package that opens a DB connection, executes shell-adjacent command dispatch, and runs as a long-lived worker is an unattended attack surface. Argument injection into console commands is the specific class to worry about, and there is no one upstream to fix it.

Key questions for the requester:

  1. Is the target application actually Laravel, or is there a Symfony service in the estate where this legitimately fits? The answer changes the decision entirely.
  2. What is the concrete capability gap — is it dependency-ordered background jobs, or command-level observability? Bus::batch() and Horizon tags cover both.
  3. Has the PHP version ceiling been verified? Run composer why-not jms/job-queue-bundle against the real composer.json before any further analysis.
  4. Is there a maintained fork, and who owns patching it?
  5. What is the audit/approval status of unmaintained transitive dependencies in our supply chain policy?

Integration Approach

Stack fit: negative for Laravel. There is no supported path. A Laravel integration would require (a) a Laravel service provider to boot Symfony's container semantics, (b) an Eloquent-or-Doctrine hybrid persistence layer for the Job entity, (c) a Supervisor-managed jms-job-queue:run process outside Laravel's queue:work lifecycle, and (d) bridging two logging, event, and container systems. That is a multi-week engineering bet on an abandoned dependency to duplicate functionality Laravel ships in core. Recommend rejecting on fit.

Recommended replacement, mapping capability to native Laravel:

Bundle capability Laravel-native substitute
Enqueue a console command as a job Artisan::queue('cmd') or a ShouldQueue job wrapping Artisan::call
Persistent job records jobs / failed_jobs tables, queue:monitor
Cron-style scheduling routes/console.php / Kernel::schedule() with withoutOverlapping(), onOneServer()
Job dependency ordering Bus::chain() (serial) or Bus::batch() with ->allowFailures() (fan-out + continuation)
Worker execution and retries queue:work with --tries, --backoff, Horizon for Redis
Observability Horizon dashboard, failed_jobs UI, Telescope

Migration path if something is already running on this bundle. Determine first whether it is embedded in a Symfony service or was force-fitted into Laravel. For a Symfony service: freeze the version, pin transitive deps, and plan a move to symfony/messenger (the first-party successor covering exactly this ground — transport, retries, failure transport, worker). For a Laravel service: the migration is a job-by-job re-expression into Laravel queues, table-by-table data port of Job rows for in-flight work only, and a cutover behind a feature flag with both workers running during the drain window.

Compatibility and sequencing. Sequence as: (1) inventory every enqueue site and scheduled command, (2) express each as a Laravel job class with identical payload contract, (3) stand up the native queue and dual-write, (4) drain the Job table to zero with the old worker still running, (5) decommission the old worker, (6) drop the schema. Do not attempt a partial coexistence where the same logical job can be picked up by both workers — duplicate execution is the dominant migration failure mode here.

If a Symfony service genuinely requires this class of functionality, do not adopt the bundle; adopt symfony/messenger. Same conceptual model, first-party maintenance, PHP 8 and Symfony 6/7 support, and a documented upgrade path. The only reason to choose jms/job-queue-bundle in 2025 is a hard constraint on an existing install, and even then the correct disposition is "contain and schedule removal," not "extend."

Operational Impact

Maintenance burden is the deciding operational factor. An unmaintained package that owns a database schema, a long-running worker process, and a scheduling loop is not a passive dependency — it is infrastructure we inherit without a vendor. Every PHP minor upgrade becomes a fork-and-patch exercise. Budget a standing maintenance line item, or better, budget the migration instead.

Support. No upstream. 334 stars is a small community for a package of this blast radius; the repository's issues are not a support channel. On-call engineers will be debugging a 2019 codebase against a modern runtime with no upstream reference. Knowledge concentration risk is severe: whoever originally wired this up becomes a single point of failure.

Scaling characteristics. The design is DB-polling based: workers poll the Job table for claimable work. That produces row contention and index pressure at high enqueue rates, and the Job table grows unbounded without a retention policy — an operational chore the bundle does not handle for you. Horizontal scale is possible (multiple jms-job-queue:run processes) but correctness depends on the claim/lock semantics in an unaudited codebase. Contrast with Redis-backed Laravel queues, which are purpose-built for throughput and have Horizon for autoscaling and per-queue worker pools.

Failure modes to plan for:

  • Duplicate execution — if job claiming is not atomic under concurrent workers, side effects run twice. Requires idempotent job bodies, which is a design constraint on every consumer.
  • Orphaned / stuck jobs — a worker killed mid-execution leaves a job in a claimed state with no heartbeat-based reaper. Needs manual intervention tooling.
  • Silent schedule drift — scheduling is cron-plus-worker; a dead worker means schedules silently stop firing. Needs alerting on worker liveness and on oldest-unclaimed-job age.
  • Unbounded table growth — needs a retention/archival job from day one.
  • No dependency-failure propagation — if the dependency-graph implementation blocks downstream jobs on upstream failure, a single poisoned job can stall a whole chain with no dead-letter path. Verify explicitly.

Ramp-up. Deceptively steep. The API surface looks small, but effective use requires Symfony container and compiler-pass fluency, Doctrine entity mapping and schema-migration ownership, and Supervisord or systemd unit management for the worker — a set of skills largely absent from a Laravel team and unlikely to be reused elsewhere in the estate. A Laravel engineer is productive on Bus::batch() in an afternoon; productive-and-confident on this bundle in a sprint, with residual risk they never fully retire.

Recommendation. Reject for Laravel. The 27.52 score and 2019 release date are consistent with the technical picture rather than incidental to it. Redirect the requirement to Laravel's native queue, scheduler, and Bus::batch(), with Horizon for operational visibility; if a Symfony service is in scope, standardize on symfony/messenger. Treat this package as an inventory item to retire, not a candidate to adopt.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console