camel-component-jms
JMS component for rust-camel. Supports ActiveMQ Classic and ActiveMQ Artemis.
URI Format
Three URI schemes are supported:
# Generic — requires explicit destination type
jms:queue:name[?param=value&...]
jms:topic:name[?param=value&...]
# Broker-specific — destination type can be omitted (defaults to queue)
activemq:queue:name[?param=value&...]
activemq:name # shorthand → queue
activemq:topic:name
artemis:queue:name[?param=value&...]
artemis:name # shorthand → queue
artemis:topic:name
Using activemq: or artemis: as scheme locks the broker_type automatically — no brokerType query param needed.
URI Query Parameters
| Parameter | Default | Description |
|---|---|---|
broker |
default_broker from config |
Named broker to use (must exist in the broker map) |
brokerUrl,username, andpasswordare not URI parameters — credentials live inCamel.tomlor programmatic config.broker_typeis inferred from the scheme (activemq:→ ActiveMQ Classic,artemis:→ Artemis) or from the broker config entry.
Overview
JMS component for rust-camel via Java bridge.
Camel.toml Configuration
[]
= "main" # which broker to use when no ?broker= param is given
[]
= "tcp://localhost:61616"
= "activemq" # "activemq" | "artemis"
= "admin" # optional
= "admin" # optional
Multiple brokers are supported — add as many [default.components.jms.brokers.<name>] entries as needed.
Quick Start
use ;
use Arc;
// Option A: single broker (programmatic)
let pool_config = single_broker;
let pool = new;
ctx.register_component;
ctx.register_component;
ctx.register_component;
// Option B: config from Camel.toml (via camel-config crate)
// JmsPoolConfig is built automatically by configure_context()
// Consumer — generic scheme
let route = from
.to
.build?;
// Consumer — activemq: shorthand (queue is the default)
let route = from
.to
.build?;
// Producer — explicit broker selection (multi-broker setup)
let route = from
.set_body
.to
.build?;
// Producer — Artemis topic
let route = from
.set_body
.to
.build?;
How It Works
The component manages a Java bridge process (jlink native binary) internally:
- On first use, downloads the bridge binary from GitHub releases (SHA256-verified, cached at
~/.cache/rust-camel/jms-bridge/). - Spawns the bridge with broker config passed via environment variables.
- Reads the ephemeral gRPC port from stdout (
{"status":"ready","port":N}). - Polls the health endpoint until ready, then routes messages over gRPC.
No Java runtime is required on the host — the bridge is a native binary.
Bridge Health Monitor
Each bridge runs a background health monitor that:
- Checks bridge health periodically (default: every 5s)
- Auto-restarts the bridge process on failure with exponential backoff (5s → 10s → 20s → ... up to 120s)
- Caps restart attempts at 10 before transitioning to a permanent
Degradedstate
Graceful Shutdown
When using the bridge pool programmatically, call begin_shutdown() before ctx.stop() to prevent the health monitor from restarting the bridge during shutdown:
pool.begin_shutdown; // Signal health monitors to stop restarting
ctx.stop.await?; // Stop routes and services
pool.shutdown.await?; // Clean up bridge processes
When using camel-cli, Ctrl+C handles shutdown automatically. A second Ctrl+C force-exits if shutdown hangs.
Environment Variables
| Variable | Description |
|---|---|
CAMEL_JMS_BRIDGE_BINARY_PATH |
Development override — absolute path to a local jms-bridge binary; skips download entirely |
CAMEL_JMS_BRIDGE_RELEASE_URL |
Override release download URL (must be https://github.com/**) |
Development Setup
Prerequisites
- Docker (daemon running)
- NixOS:
programs.nix-ld.enable = truemust be set in your NixOS configuration - Linux: glibc ≥ 2.34 (Ubuntu 22.04+, Debian 12+, RHEL 9+)
Building the JMS Bridge
The bridge binary is built using Docker (no Java required on your host):
# One-time build (~5–8 min first time, faster on subsequent runs)
# The binary is auto-detected. No env vars needed:
Override
If you need to use a custom binary:
Known Limitations
- IBM MQ not supported (planned for a future release)
- No durable topic subscribers yet
- Bridge uses
AUTO_ACKNOWLEDGE— messages are acknowledged on delivery, not after processing. Failed messages cannot be redelivered by the broker.
Installation
Add to your Cargo.toml:
[]
= "*"