Remote Procedure Calls RPC using RabbitMQ in C# .NET
RabbitMQ.NET
RabbitMQ.NET is a .NET Core library to easily integrate RabbitMQ in .NET applications
Nuget
https://www.nuget.org/packages/RabbitMQ.NET/
Github
https://github.com/rizansari/RabbitMqCore
Installation
Install-Package RabbitMQ.NET
Using the library
RabbitMQ.NET is a simple library to Publish and Subscribe easily in .NET Core applications. It now supports Remote Procedure Calls RPC in very intuitive manner
Setup DI
var serviceProvider = new ServiceCollection()
.AddLogging(loggingBuilder =>
{
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.AddRabbitMQCore(options =>
{
options.HostName = "localhost";
})
.BuildServiceProvider();
Get QueueService
var rmq = serviceProvider.GetRequiredService();
RPC Server
var rpcServer = rmq.CreateRpcServer(options =>
{
options.RpcName = "TEST_RPC";
});
rpcServer.Subscribe(request =>
{
// get request object
var obj = JsonConvert.DeserializeObject(request.Message);
// response with response object
rpcServer.Respond(new RabbitMessageOutbound()
{
CorrelationId = request.CorrelationId,
Message = JsonConvert.SerializeObject(obj)
});
});
RPC Client
var rpcClient = rmq.CreateRpcClient(options =>
{
options.RpcName = "TEST_RPC";
});
SimpleObject obj = null;
RabbitMessageOutbound message = null;
int count = 1;
while (true)
{
try
{
obj = new SimpleObject() { ID = count++, Name = "Request" };
message = new RabbitMessageOutbound()
{
CorrelationId = $"CorrelationId:{obj.ID}",
Message = JsonConvert.SerializeObject(obj)
};
rpcClient.Call(message, response =>
{
// response received from RPC Server
Console.WriteLine("rpc response: {0}", response.Message);
}, 10000);
Console.WriteLine("rpc request: {0}", message.Message);
Thread.Sleep(2000);
}
catch (OutboundMessageFailedException ex)
{
Console.WriteLine("Message failed {0}:{1}", obj.ID, ex.RabbitMessageOutbound.Message);
Thread.Sleep(2000);
}
catch (NotConnectedException ex)
{
Console.WriteLine("NotConnectedException Message failed {0}", obj.ID);
Thread.Sleep(2000);
}
catch (Exception ex)
{
Console.WriteLine("Message failed {0}", obj.ID);
Thread.Sleep(2000);
}
}
rpcClient.Dispose();