Getting Started
Architecture
NServiceBus
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

RabbitMQ native integration

Target Version: NServiceBus 8.x

This document describes how to consume messages from and send messages to non-NServiceBus endpoints via RabbitMQ in integration scenarios.

Access to the native RabbitMQ message details

It can sometimes be useful to access the native RabbitMQ message from behaviors and handlers. When a message is received, the transport adds the native RabbitMQ client BasicDeliverEventArgs to the message processing context. Use the code below to access the message details from a pipeline behavior:

class AccessToBasicDeliverEventArgs : Behavior<IIncomingContext>
{
    public override Task Invoke(IIncomingContext context, Func<Task> next)
    {
        var userIdOnBroker = context.Extensions.Get<BasicDeliverEventArgs>().BasicProperties.UserId;

        //do something useful

        return next();
    }
}

Custom message ID strategy

By default, the message-id property of the AMQP standard is used to relay the message identity. If this property isn't set, the transport will throw an exception because NServiceBus requires a message identity to perform retries, de-duplication, etc., in a safe way.

For integration scenarios where the sender is not controlled, the receiver might need to employ a custom strategy that extracts a message identity from a custom header or part of the message body. This custom strategy can be configured by calling:

var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.CustomMessageIdStrategy(
    customIdStrategy: deliveryArgs =>
    {
        var headers = deliveryArgs.BasicProperties.Headers;
        return headers["MyCustomId"].ToString();
    });

Message type detection

The native message must allow NServiceBus to detect message type either via headers or message payload.

Samples

Related Articles