Looking for documentation of 1.x? Click here
RawRabbit
is a modern .NET framework for communication over RabbitMQ. The modular design and middleware oriented architecture makes the client highly customizable while providing sensible default for topology, routing and more. Documentation for version 2.x of the is currently found under /docs
.
RawRabbit
is configured with RawRabbitOptions
, an options object that makes it possible to register client configuration, plugins as well as override internal services
var client = RawRabbitFactory.CreateSingleton(new RawRabbitOptions
{
ClientConfiguration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("rawrabbit.json")
.Build()
.Get<RawRabbitConfiguration>(),
Plugins = p => p
.UseProtobuf()
.UsePolly(c => c
.UsePolicy(queueBindPolicy, PolicyKeys.QueueBind)
.UsePolicy(queueDeclarePolicy, PolicyKeys.QueueDeclare)
.UsePolicy(exchangeDeclarePolicy, PolicyKeys.ExchangeDeclare)
),
DependencyInjection = ioc => ioc
.AddSingleton<IChannelFactory, CustomChannelFactory>()
});
Set up strongly typed publish/subscribe in just a few lines of code.
var client = RawRabbitFactory.CreateSingleton();
await client.SubscribeAsync<BasicMessage>(async msg =>
{
Console.WriteLine($"Received: {msg.Prop}.");
});
await client.PublishAsync(new BasicMessage { Prop = "Hello, world!"});
RawRabbits
request/response (RPC
) implementation uses the direct reply-to feature for better performance and lower resource allocation.
var client = RawRabbitFactory.CreateSingleton();
client.RespondAsync<BasicRequest, BasicResponse>(async request =>
{
return new BasicResponse();
});
var response = await client.RequestAsync<BasicRequest, BasicResponse>();
Unlike many other clients, basic.ack
, basic.nack
and basic.reject
are first class citizen in the message handler
var client = RawRabbitFactory.CreateSingleton();
await client.SubscribeAsync<BasicMessage>(async msg =>
{
if(UnableToProcessMessage(msg))
{
return new Nack(requeue: true);
}
ProcessMessage(msg)
return new Ack();
});
In addition to the basic acknowledgements, RawRabbit also suppoert delayed retries
var client = RawRabbitFactory.CreateSingleton();
await client.SubscribeAsync<BasicMessage>(async msg =>
{
try
{
ProcessMessage(msg)
return new Ack();
}
catch (Exception e)
{
return Retry.In(TimeSpan.FromSeconds(30));
}
});
Add or change properties in the IPipeContext
to tailor calls for specific type of messages. This makes it possible to modifly the topology features for calls, publish confirm timeout, consumer concurrency and much more
await subscriber.SubscribeAsync<BasicMessage>(received =>
{
receivedTcs.TrySetResult(received);
return Task.FromResult(true);
}, ctx => ctx
.UseSubscribeConfiguration(cfg => cfg
.Consume(c => c
.WithRoutingKey("custom_key")
.WithConsumerTag("custom_tag")
.WithPrefetchCount(2)
.WithNoLocal(false))
.FromDeclaredQueue(q => q
.WithName("custom_queue")
.WithAutoDelete()
.WithArgument(QueueArgument.DeadLetterExchange, "dlx"))
.OnDeclaredExchange(e=> e
.WithName("custom_exchange")
.WithType(ExchangeType.Topic))
));