overblog/activemq-bundle
Symfony bundle that integrates Apache ActiveMQ messaging into your application. It provides configuration for STOMP connections, message producers and consumers, and seamless service wiring, making it easy to add reliable queue-based communication to Symfony projects.
Architecture fit — poor as a direct dependency. overblog/activemq-bundle is a Symfony bundle, not a Laravel package. Its value is delivered through Symfony's Bundle/Extension/CompilerPass machinery: a Configuration tree built with TreeBuilder, service definitions wired via YAML/XML, and event subscribers that hook into Symfony's kernel. Laravel has no equivalent bundle contract — there is no registerBundles() step, no DI compiler pass, no config-tree validation, and no HttpKernel event lifecycle. Adopting it means either pulling a large slice of symfony/* into a Laravel app (framework-bundle, dependency-injection, config, http-kernel) or forking and re-homing the logic.
More importantly, the bundle solves a problem Laravel already solves at a different layer. Laravel's queue subsystem is built around Illuminate\Queue\Connectors\ConnectorInterface, Queue, and Job contracts, with a worker loop that handles retries, backoff, failed_jobs persistence, timeouts, signals, and Horizon-style supervision. The bundle predates and ignores all of that — it provides a STOMP connection factory, a producer service, and a Symfony-idiomatic consumer command. There is no Laravel queue driver, no Job serialization contract, no failed-job store, no worker integration.
Integration feasibility — low as-is, moderate as a reference implementation. The genuinely reusable asset is not the bundle; it is the pattern of fusesource/stomp-php + a connection factory + a consumer loop. That pattern is roughly 200–400 lines to reimplement natively as a Laravel queue connector. Buying the bundle to get that pattern costs you a Symfony dependency tree and an unmaintained transitive graph.
Technical risk — high, concentrated in abandonment.
| Risk | Severity | Notes |
|---|---|---|
| Abandonment | High | Last release 2018-03-05; ~8 years stale |
| Community | High | 10 stars, 0 dependents, single-digit contributors — no upstream fix path |
| PHP/Symfony ceiling | High | 2018-era constraints almost certainly pin PHP ≤7.x and Symfony ≤4.x; will collide with PHP 8.2/8.3 and Laravel 10/11 |
| Security patching | High | Transitive deps (stomp-php, Symfony 3/4 components) inherit known CVEs; you own them |
| Protocol/feature fit | Medium | STOMP only; ActiveMQ Classic's STOMP path is slower and less featured than OpenWire/AMQP |
| Observability | Medium | No Laravel-native events, metrics, or failed-job introspection |
The reported opportunity score of 10.21 and quality score of ~0.91 are misleading in this context — they reward recency-neutral signals like license and metadata completeness. For a package with zero dependents and no release in eight years, low adoption is a negative signal, not headroom. Treat the score as noise.
Key questions for the broker owner / stakeholders:
send() in a web request changes latency and failure-mode requirements substantially.Recommendation: do not adopt the bundle. Adopt the broker, and implement the client natively behind Laravel's queue contracts.
Ranked options:
stomp-php. Implement ConnectorInterface + Queue, register via QueueServiceProvider extension in a first-party package. You get dispatch(), dispatchSync(), retries, failed_jobs, queue:work, queue:retry, and Telescope/Horizon-adjacent observability for free. Effort: ~1–2 engineer-weeks including tests. This is the same work the bundle would force on you anyway, minus the Symfony baggage.composer require overblog/activemq-bundle as-is. Expect immediate resolution conflicts; resolving them means --ignore-platform-reqs or patching composer.json, which is where maintainability ends.Stack fit and compatibility. Verify before anything else: composer require --dry-run against your actual PHP and Laravel versions. Expect php: ^7.0|^7.1 and symfony/framework-bundle: ^3.0|^4.0-style constraints. Note that stomp-php itself is independently maintained and may be usable directly even if the bundle is not — this is the key decoupling move: extract the dependency you actually need and drop the wrapper.
Sequencing.
stomp-php directly from a Laravel artisan command. No bundle. Output: a go/no-go on protocol feasibility and a measured round-trip latency under nominal load.serialize()-style PHP object payloads are forbidden — they make replay across releases impossible.ConnectorInterface, Queue, Job, plus reconnect/backoff, prefetch tuning, visibility timeout mapping, and DLQ routing. Unit tests with a fake broker; one integration test against the container.Compatibility guardrail. If any part of the path requires --ignore-platform-reqs, treat that as a hard stop and escalate — it means the dependency graph is already drifted from your runtime and will silently break on the next PHP minor.
Maintenance. Upstream maintenance is effectively zero: no releases since March 2018, no meaningful dependent base to surface bugs, no realistic expectation of a CVE response. You inherit full custodianship on day one. Budget roughly 10–15% of one engineer's capacity for dependency patching, broker-client upgrades, and envelope-format migrations. If the fork option is chosen, add the cost of rebasing against nothing — there is no upstream to rebase from, so the fork is a hard divergence and should be treated as first-party code.
Support. No maintainer SLA, no active issue triage, and the available community knowledge skews to Symfony 2/3-era idioms (service IDs, @service annotations, services.yml). Engineers searching for answers will find guidance that does not apply to the code in front of them. Escalation path is internal-only — name an owner in the ADR.
Scaling. Consumer-side horizontal scaling is straightforward: STOMP is a persistent TCP connection, so each queue:work process holds one socket to the broker. Watch connection count against broker limits as worker count grows, and watch connection churn — reconnect storms after a broker restart are the most common production incident here. Prefetch and ack-mode tuning materially affect throughput and redelivery volume. On the broker side, ActiveMQ Classic's STOMP path is the least performant of its protocol options; if throughput targets are aggressive, that is an argument for AMQP or OpenWire and against this entire package family.
Failure modes to design for explicitly:
| Failure | Symptom | Mitigation |
|---|---|---|
| Silent socket drop | Worker alive, consuming nothing | Heartbeats + reconnect with jittered backoff + a liveness metric |
| Unacked redelivery storm | Duplicate processing, broker load spike | Idempotency keys; bounded redelivery; explicit DLQ |
| Consumer death without signal | Queue depth grows, no alert | Depth + age-of-oldest-message alerts, not just depth |
| Envelope drift | Replay of old messages crashes new consumers | Versioned JSON envelopes, never PHP serialize() |
| Sync send in request path | Elevated p95, cascading timeouts | Async-only dispatch; short send timeout; circuit breaker |
| Dependency rot | Sudden breakage on PHP upgrade | Pin and audit transitive deps; avoid platform-req overrides |
Ramp-up. A mid-level Laravel engineer is productive on a native connector in 2–3 days. The same engineer needs 3–5 days just to read the Symfony bundle source competently — bundles, compiler passes, and tag-based service collection are not transferable Laravel knowledge, and the effort yields nothing reusable after the fork. That asymmetry is the clearest operational argument for option 1: you pay less to build the thing you understand than to understand the thing you didn't build.
Bottom line. This package is a 2018 Symfony artifact with no adoption and no maintenance path. It is useful as a reference implementation of ActiveMQ-over-STOMP integration, and should be read, not required. The correct move is to adopt the broker if the organization genuinely needs it, and implement the Laravel queue connector directly — behind the framework's queue abstraction, so the next migration is a config change rather than another archaeology project.
How can I help you explore Laravel packages today?