AMQP

Use Nimbus with AMQP brokers, optimized for ActiveMQ Artemis

The Nimbus AMQP transport connects to any AMQP 1.0 compliant broker. It is primarily tested against ActiveMQ Artemis and takes advantage of Artemis-specific extensions, most notably native scheduled message delivery via the _AMQ_SCHED_DELIVERY header. If you want a self-hosted, open-standard broker with full infrastructure control, AMQP is the right choice.

Installation

dotnet add package Nimbus.Transports.AMQP

Quick Start

Run ActiveMQ Artemis

docker run -d \
  --name artemis \
  -p 5672:5672 \
  -p 8161:8161 \
  -e ARTEMIS_USERNAME=admin \
  -e ARTEMIS_PASSWORD=admin \
  apache/activemq-artemis:latest

The Artemis web console is available at http://localhost:8161.

Configure Nimbus

using Nimbus;
using Nimbus.Configuration;
using Nimbus.Transports.AMQP;

var bus = new BusBuilder()
    .Configure()
    .WithNames("OrderService", Environment.MachineName)
    .WithTransport(new AMQPTransportConfiguration()
        .WithBrokerUri("amqp://localhost:5672")
        .WithCredentials("admin", "admin"))
    .WithTypesFrom(typeProvider)
    .WithAutofacDefaults(container)
    .Build();

await bus.Start();
new AMQPTransportConfiguration()
    .WithFailover("amqp://broker1:5672", "amqp://broker2:5672")
    .WithCredentials("admin", "admin")

Scheduled Delivery

Nimbus uses Artemis’s native _AMQ_SCHED_DELIVERY header for deferred messages, so no polling or workaround is required — the broker itself holds the message until the scheduled time:

// Deliver after a delay
await bus.SendAfter(new MyCommand(), TimeSpan.FromMinutes(5));

// Deliver at a specific time
await bus.SendAt(new MyCommand(), DateTimeOffset.UtcNow.AddHours(1));

ActiveMQ Artemis 2.x+ required for scheduled delivery. ActiveMQ Classic 5.x has limited support and does not use _AMQ_SCHED_DELIVERY.

Idle Subscription Cleanup

Multicast event subscribers use JMS durable subscriptions named per instance, and the broker keeps a durable subscription until something unsubscribes it. Nimbus does not remove them and WithAutoDeleteOnIdle has no effect on this transport, so subscriptions orphaned by restarts accumulate, along with the messages queued for them.

Configure cleanup on the broker instead (for example, ActiveMQ Classic’s offlineDurableSubscriberTimeout), or remove stale subscriptions with your broker’s management tooling. Check your broker’s documentation for the equivalent setting, as the options differ between brokers and versions.

Limitations

  • JMS selectors are not implemented — message filtering happens at the handler level.

Compatibility

  • ✅ ActiveMQ Artemis 2.x+ (recommended — full feature support)
  • ✅ ActiveMQ Classic 5.12+ (limited — delayed delivery not supported)
  • ✅ Apache NMS AMQP 2.2.0