public async Task <TResponse> CallAsync <TRequest, TResponse>(TRequest request, string exchangeName, string subscriberQueueName, string routingKey = "")
        {
            _rabbitMqSubscriber.Subscribe(subscriberQueueName, OnMessageReceived);

            var tcs = new TaskCompletionSource <string>();

            var ct = new CancellationTokenSource(TimeSpan.FromMilliseconds(TIMEOUT_MS));

            ct.Token.Register(() => tcs.TrySetCanceled(), false);

            var correlationId = Guid.NewGuid().ToString();

            _pendingMessages[correlationId] = tcs;

            _logger.LogInformation("RPC request {@Data}", new
            {
                CorrelationId = correlationId
            });

            _rabbitMqPublisher.Publish(request, exchangeName, routingKey, subscriberQueueName, correlationId);

            var response = await tcs.Task;

            _logger.LogInformation("Received RPC response {@Data}", new
            {
                CorrelationId = correlationId
            });

            return(JsonConvert.DeserializeObject <TResponse>(response));
        }
 public void Subscribe <TRequest, TResponse>(Func <TRequest, Task <TResponse> > action, string queueName)
 {
     _rabbitMqSubscriber.Subscribe(queueName, args => OnMessageReceived(args, action));
 }