Home

Awesome

Carrot

Carrot is a .NET lightweight library that provides a couple of facilities over RabbitMQ.

install from nugetdownloads

What is it?

Prompted by the need for an easy-to-use RabbitMQ access component not requiring lots of boilerplate code in order to accomplish basic operations with RabbitMQ broker. Inspired by MassTransit.

Getting started

Just mark your POCO message contracts with MessageBinding attribute:

[MessageBinding("urn:message:foo")]
public class Foo
{
    public Int32 Bar { get; set; }
}

Define your message consumer:

class FooConsumer : Consumer<Foo>
{
    public override Task ConsumeAsync(ConsumingContext<Foo> context)
    {
        return Task.Factory.StartNew(() =>
                                     {
                                         Console.WriteLine("received '{0}'",
                                                           context.Message.Headers.MessageId);
                                     });
    }
}

Create an instance of Broker providing the RabbitMQ host as input.

var broker = Broker.New(_ =>
                        {
                            _.Endpoint(new Uri("amqp://guest:guest@localhost:5672/", UriKind.Absolute));
                            _.ResolveMessageTypeBy(new MessageBindingResolver(typeof(Foo).GetTypeInfo().Assembly));
                        });

Declare your AMQP entities as the following:

var exchange = broker.DeclareDirectExchange("source_exchange");
var queue = broker.DeclareQueue("my_test_queue");

Bind entities, subscribe your queue and call IBroker.Connect:

broker.DeclareExchangeBinding(exchange, queue, "routing_key");
broker.SubscribeByAtLeastOnce(queue, _ => _.Consumes(new FooConsumer()));
var connection = broker.Connect();

You're up 'n running! Do not forget to call IConnection.Dispose() when your application exits.

Please note that exchanges, queues and messages are not durable by default. You can create durable entities by calling the proper builder methods.

var durableExchange = broker.DeclareDurableDirectExchange("source_exchange");
var durableQueue = broker.DeclareDurableQueue("my_test_queue");

You can publish messages as the following:

connection.PublishAsync(new OutboundMessage<Foo>(new Foo { Bar = 2 }),
                        exchange);

Please note that messages are not durable by default. If you need durable messaging, make use of DurableOutboundMessage<T>:

connection.PublishAsync(new DurableOutboundMessage<Foo>(new Foo { Bar = 2 }),
                        exchange);

To activate publisher confirms, configure a reliable outbound channel when creating the broker:

var broker = Broker.New(_ =>
                        {
                            _.Endpoint(new Uri("amqp://guest:guest@localhost:5672/", UriKind.Absolute));
                            _.ResolveMessageTypeBy(new MessageBindingResolver(typeof(Foo).GetTypeInfo().Assembly));
                            _.PublishBy(OutboundChannel.Reliable());
                        });

Building from Source

Clone the source down to your machine.

git clone https://github.com/naighes/Carrot.git

Run .\build.ps1

Resources