Getting Started
Architecture
NServiceBus
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

RabbitMQ native integration

Target Version: NServiceBus 9.x

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

Access to the received 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();
    }
}

Access to the native RabbitMQ message details prior to sending

When integrating with other software systems it might be necessary to customize the native RabbitMQ message immediately before sending it to the broker. This can be done by registering a callback that gets invoked for each message as a last step before handing the message to the RabbitMQ client SDK.

var rabbitMqTransport = new RabbitMQTransport(
    routingTopology: RoutingTopology.Conventional(QueueType.Classic),
    connectionString: "host=localhost;username=rabbitmq;password=rabbitmq",
    enableDelayedDelivery: false
);

rabbitMqTransport.OutgoingNativeMessageCustomization = (operation, properties) =>
{
    //Set values on IBasicProperties
    properties.ContentType = "application/my-type";
};

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