Skip to content

Create REST Publisher

This page shows how to create a RabbitMQ REST publisher manually.

The available implementations are:

StatelessRestPublisherBound
FullDuplexRestPublisherBound

Choose The Publisher

Publisher Description
StatelessRestPublisherBound Sends requests without waiting for a response.
FullDuplexRestPublisherBound Sends requests and waits for a correlated response.

Create Connection And Channel

var factory = new ConnectionFactory
{
    HostName = "localhost",
    UserName = "guest",
    Password = "guest",
    DispatchConsumersAsync = true
};

using var connection =
    factory.CreateConnection("rest-publisher-demo");

using var channel =
    connection.CreateChannel();

For the RabbitMQ.Client v7 provider, CreateChannel() supports an optional delivery confirmation parameter used to enable publisher confirms during channel creation.


Create Formatter

This guide assumes that an IDataFormatter instance has already been created.

See:

  • Getting Started → Create Formatter
IDataFormatter formatter = ...;

Create REST Message Serializer

var streamResolver =
    new FuncMemoryStreamResolver(
        () => new MemoryStream(),
        bytes => new MemoryStream(bytes));

IHttpRestMessageSerializer messageSerializer =
    new HttpRestMessageSerializer(
        streamResolver,
        Encoding.UTF8);

Create Descriptor

var descriptor =
    new RestPublisherBoundDescriptor
    {
        ServiceName = "pricing",

        Durable = true,

        Timeout = TimeSpan.FromSeconds(30),

        ContextType = HttpHeaders.JsonContentType,

        IncludeContent = true
    };

Create Publisher

await using var publisher =
    new FullDuplexRestPublisherBound(
        descriptor,
        channel,
        formatter,
        messageSerializer);

Send A Request

var request =
    new RestRequest
    {
        Method = "POST",

        Path = "/api/pricing/calculate",

        Data = new CalculatePriceRequest
        {
            ProductId = Guid.NewGuid(),
            Quantity = 2
        }
    };

var response =
    await publisher.SendAsync<CalculatePriceResponse>(
        request);

Runtime Flow

sequenceDiagram

    participant Client
    participant Publisher
    participant RabbitMQ
    participant RestHost

    Client->>Publisher: RestRequest

    Publisher->>RabbitMQ: Publish

    RabbitMQ->>RestHost: Deliver

    RestHost-->>RabbitMQ: Response

    RabbitMQ-->>Publisher: Deliver

    Publisher-->>Client: RestResponse

Next Step

Continue with:

  • Create REST Subscriber
  • ASP.NET Core Integration
  • IAsyncRestPublisher